В чем разница между INNER JOIN и LEFT JOIN в SQL?

«В чем разница между INNER JOIN и LEFT JOIN в SQL?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

INNER JOIN возвращает только те строки, для которых условие соединения (ON) выполняется в обеих таблицах. Строки без пары отбрасываются.

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

Визуализация:

Таблица A        Таблица B        INNER JOIN A и B      LEFT JOIN A и B
--------        --------        ---------------      ---------------
id | name      id | value      A.id | A.name | B.value   A.id | A.name | B.value
1  | Alice     1  | 100        1    | Alice  | 100       1    | Alice  | 100
2  | Bob       3  | 300        3    | Carol  | 300       2    | Bob    | NULL
3  | Carol                                    3    | Carol  | 300

Пример SQL-запросов:

-- INNER JOIN: Только клиенты, сделавшие заказы.
SELECT c.id, c.name, o.order_date
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id;

-- LEFT JOIN: Все клиенты, даже те, кто не делал заказов.
SELECT c.id, c.name, o.order_date
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.order_date IS NULL; -- Частый случай: найти клиентов без заказов.

Практическое правило:

  • Используйте INNER JOIN, когда вам нужны только связанные данные из обеих таблиц.
  • Используйте LEFT JOIN, когда вам нужны все записи из основной (левой) таблицы, и дополнительная информация из связанной таблицы — если она есть.