Данная статья относится к циклу статей, посвященных PostgreSQL. В предыдущей статье мы говорили о внутреннем объединении PostgreSQL. Теперь же мы углубимся в изучение левого объединения, именуемого LEFT JOIN, при помощи которого мы будем выбирать данные из нескольких таблиц.
Введение в условие PostgreSQL LEFT JOIN
Предположим, что у нас есть две таблицы: A и B.
Данные таблицы B связаны с данными таблицы A через поле fka.
Каждая строка таблицы A может совпадать как с несколькими строками таблицы B, так и ни с одной.
Если вам необходимо выбрать строки из таблицы A, совпадающие со строками в таблице B, используйте условие INNER JOIN.
Если же вам необходимо выбрать строки из таблицы A, которые могут или иметь, или не иметь соответствующие строки в таблице B, используйте условие LEFT JOIN. В случае, если в таблице B нет соответствующей строки, значения столбцов в таблице B принимают значения NULL.
Следующий запрос отображает синтаксис вызова условия LEFT JOIN, объединяющего таблицу A с таблицей B:
SELECT
A.pka,
A.c1,
B.pkb,
B.c2
FROM
A
LEFT JOIN B ON A .pka = B.fka;
Чтобы объединить таблицу A с таблицей B, вам необходимо:
- В условии SELECT указать столбцы, из которых вы хотите выбрать данные.
- В условии FROM указать левую таблицу, т.е. A, из которой вы хотите получить все строки.
- В условии LEFT JOIN укажите правую таблицу, т.е. B. Кроме того, укажите условия объединения двух таблиц.
Условие LEFT JOIN возвращает все строки из левой таблицы (A), которые объединены со строками в правой таблице (B), даже если в правой таблице (B) нет соответствующих строк.
Условие LEFT JOIN также называется LEFT OUTER JOIN.
Следующая диаграмма Венна отображает, как работает условие LEFT JOIN. В пересечении находятся строки таблицы A, соответствующие строкам таблицы B.
Примеры использование условия PostgreSQL LEFT JOIN
Обратим внимание на следующую ER-диаграмму, которая является частью примера базы данных DVD-проката.
Каждая строка в таблице film может иметь как несколько, так и ни одной строки в таблице inventory. Каждая строка в таблице inventory имеет одну и только одну строку в таблице film.
Используйте условие LEFT JOIN для объединения таблицы film с таблицей inventory следующим образом:
SELECT
film.film_id,
film.title,
inventory_id
FROM
film
LEFT JOIN inventory ON inventory.film_id = film.film_id;
Поскольку некоторые строки в таблице film не имеют соответствующих строк в таблице inventory, значения inventory_id будут принимать NULL.
Вы можете добавить условие WHERE, чтобы выбрать только те фильмы, которые не содержаться в inventory, используя следующий запрос:
SELECT
film.film_id,
film.title,
inventory_id
FROM
film
LEFT JOIN inventory ON inventory.film_id = film.film_id
WHERE
inventory.film_id IS NULL;
Этот метод полезен, когда вы хотите выбрать данные из одной таблицы, не совпадающие с данными другой таблицы.
На этом мы завершаем ознакомление с левым объединением в PostgreSQL и переходим к Self-Join.
Источник: PostgreSQL Tutorial from Scratch