Оператор NATURAL JOIN для объединения таблиц в PostgreSQL
Что такое NATURAL JOIN?
Оператор NATURAL JOIN позволяет объединить таблицы при помощи неявного объединения, то есть не нужно указывать условие для объединения (ON) и объединение таблиц будет выполнено на основании общего столбца или столбцов этих таблиц. Другими словами, таблицы будут объединены по столбу или столбцам, которые есть и в той и в другой таблице.
Используйте оператор NATURAL JOIN только тогда, когда это возможно, потому что это может привести к неожиданному результату.
Для наглядности, работа оператора NATURAL JOIN представлена ниже на изображении. В левой и правой таблице есть общий столбец id_job, по которому будет выполнено неявное объединение, а результат объединения этих таблиц обведён пунктирной линией.
Синтаксис оператора NATURAL JOIN
В операторе NATURAL JOIN не нужно указывать в явном виде условие для объединения таблиц (ON), так как этот оператор работает по принципу неявного объединения.
SELECT список_столбцов FROM таблица_1 NATURAL [INNER, LEFT, RIGHT] JOIN таблица_2 WHERE условия_для_фильтрации;
Синтетические данные для работы
Для демонстрации работы оператора NATURAL JOIN потребуется создать тестовые таблицы и заполнить их данными. В таблице list_users хранится информация о сотрудниках компании, а в таблице job список специализаций.
-- создание таблицы job CREATE TABLE job ( id_job integer, name_job varchar(30) ); INSERT INTO job(id_job, name_job) VALUES (3, 'Дизайнер'), (4, 'Менеджер'), (5, 'Разработчик'), (6, 'Аналитик'); -- создание таблицы list_users CREATE TABLE list_users ( id_user integer, first_name varchar(30), last_name varchar(40), id_job integer ); INSERT INTO list_users(id_user, first_name, last_name, id_job) VALUES (1, 'Михаил', 'Павлов', 3), (2, 'Илья', 'Виноградов', 4), (3, 'Сергей', 'Киселев', 4), (4, 'Али', 'Маслов', 6), (5, 'Медина', 'Софронова', 5), (6, 'Илья', 'Левин', 5), (7, 'Кирилл', 'Мартынов', 5);
Практический пример
Необходимо объединить две таблицы list_users и job методом объединения NATURAL JOIN, а затем вывести для каждого сотрудника название его специализации.
Запрос ниже написан с использованием оператора NATURAL JOIN. Таблицы list_users и job будут неявно объединены, то есть объединение будет выполнено по столбцу id_job, так как он есть и в той и в другой таблице.
-- Запрос с использованием NATURAL JOIN SELECT u.*, j.name_job FROM list_users u NATURAL JOIN job j;
А вот эти запросы написаны с использованием оператора INNER JOIN и они вернут идентичные результаты, так как эквивалентны запросу выше.
-- 1 вариант SELECT * FROM list_users INNER JOIN job USING (id_job); -- 2 вариант SELECT u.*, j.name_job FROM list_users u INNER JOIN job j ON j.id_job = u.id_job;
Выполним любой запрос и получим результат, в котором для каждого сотрудника компании указана его специализации.
Метки: NATURAL JOIN, PostgreSQL.