SQL код скопирован в буфер обмена
Узнайте, как использовать SQL LEFT JOIN (или LEFT OUTER JOIN) для получения всех записей из одной таблицы и соответствующих записей из другой. Этот урок объясняет логику «лево» и «право» в операциях JOIN, работу с NULL для несовпадающих записей и практические примеры с использованием базы данных Sakila. Освойте методы поиска недостающих данных и создания полных отчетов.
EN PT

Урок 5.3: LEFT JOIN - Включение всех записей из левой таблицы

В то время как INNER JOIN возвращает только те строки, для которых есть совпадение в обеих таблицах, существует множество сценариев, когда вам нужно сохранить все записи из одной таблицы, даже если для них нет совпадений в другой. Это именно то, что делает LEFT JOIN (также известный как LEFT OUTER JOIN).

Что такое LEFT 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

Синтаксис для 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 является необязательным.

Практические примеры (база данных Sakila)

1. Поиск всех клиентов и их платежей

Предположим, нам нужен список всех клиентов, включая тех, кто никогда не совершал платежей. 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, это клиенты, у которых нет записей о платежах.

2. Выявление «мертвого» инвентаря

Давайте найдем все копии фильмов (инвентарь) и проверим, сдавались ли они когда-либо в аренду.

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, мы можем найти конкретные предметы в нашем инвентаре, которые ни разу не сдавались в аренду.

Важные моменты

  1. Порядок таблиц имеет значение: В LEFT JOIN таблица, указанная после FROM, является «левой». Если вы поменяете таблицы местами, результат полностью изменится.
  2. Обработка NULL: При использовании LEFT JOIN программный код вашего приложения должен быть готов к обработке значений NULL в результатах.
  3. Фильтрация: Если вы укажете условие в предложении WHERE, которое ссылается на правую таблицу, вы можете случайно превратить свой LEFT JOIN в INNER JOIN (это распространенная ловушка в SQL).

Ключевые выводы урока

  • LEFT JOIN возвращает все строки из левой таблицы независимо от наличия совпадения.
  • Столбцы из правой таблицы будут содержать NULL, если совпадение не найдено.
  • Это мощный инструмент для поиска недостающих данных или создания полных списков.
  • В отличие от INNER JOIN, порядок таблиц в запросе существенно влияет на результат.