В то время как INNER JOIN возвращает только те строки, для которых есть совпадение в обеих таблицах, существует множество сценариев, когда вам нужно сохранить все записи из одной таблицы, даже если для них нет совпадений в другой. Это именно то, что делает LEFT JOIN (также известный как LEFT OUTER JOIN).
LEFT JOIN возвращает все строки из «левой» таблицы (той, которая указана первой в запросе) и соответствующие строки из «правой» таблицы (той, которая указана после ключевого слова JOIN).
Если для конкретной строки в левой таблице нет совпадения в правой таблице, база данных все равно вернет строку из левой таблицы, но подставит NULL во все столбцы, относящиеся к правой таблице.
Визуализация:
Таблица A (customer) Таблица B (payment)
+----+----------+ +----+----------+
| id | name | | id | amount |
+----+----------+ +----+----------+
| 1 | Alice | <--------> | 1 | 10.00 | (Совпадение!)
| 2 | Bob | <--------> | 1 | 15.00 | (Совпадение!)
| 3 | Charlie | <--------? | NULL | (Нет совпадения, Charlie остается!)
+----+----------+ +----+----------+
В этом примере Charlie включен в результаты, хотя у него нет платежей. В столбце "amount" для его строки будет значение NULL.
Синтаксис для LEFT JOIN идентичен INNER JOIN, но используется другое ключевое слово:
SELECT
table1.column1,
table2.column2
FROM
table1
LEFT JOIN
table2 ON table1.common_column = table2.common_column;
LEFT JOIN: Гарантирует, что все строки из table1 (левой таблицы) будут сохранены.ON: Условие для сопоставления.Примечание:
LEFT JOINиLEFT OUTER JOIN- это одно и то же. Ключевое словоOUTERявляется необязательным.
Предположим, нам нужен список всех клиентов, включая тех, кто никогда не совершал платежей. INNER JOIN отфильтровал бы клиентов без платежей, но LEFT JOIN сохранит их.
SELECT
c.first_name,
c.last_name,
p.amount
FROM
customer AS c
LEFT JOIN
payment AS p ON c.customer_id = p.customer_id
ORDER BY
p.amount ASC;
Если вы видите строки, в которых amount равен NULL, это клиенты, у которых нет записей о платежах.
Давайте найдем все копии фильмов (инвентарь) и проверим, сдавались ли они когда-либо в аренду.
SELECT
i.inventory_id,
f.title,
r.rental_id
FROM
inventory AS i
JOIN
film AS f ON i.film_id = f.film_id
LEFT JOIN
rental AS r ON i.inventory_id = r.inventory_id
WHERE
r.rental_id IS NULL;
Используя LEFT JOIN, а затем фильтруя по r.rental_id IS NULL, мы можем найти конкретные предметы в нашем инвентаре, которые ни разу не сдавались в аренду.
LEFT JOIN таблица, указанная после FROM, является «левой». Если вы поменяете таблицы местами, результат полностью изменится.LEFT JOIN программный код вашего приложения должен быть готов к обработке значений NULL в результатах.WHERE, которое ссылается на правую таблицу, вы можете случайно превратить свой LEFT JOIN в INNER JOIN (это распространенная ловушка в SQL).INNER JOIN, порядок таблиц в запросе существенно влияет на результат.