← Назад к вопросам

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

1.0 Junior🔥 122 комментариев
#Работа с данными

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между INNER JOIN и LEFT JOIN в SQL

INNER JOIN и LEFT JOIN — это два фундаментальных типа соединения таблиц в реляционных базах данных, которые работают по принципиально разной логике выборки данных. Основное различие заключается в том, какие строки попадают в результирующий набор из каждой из соединяемых таблиц.

INNER JOIN (Внутреннее соединение)

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

-- Пример INNER JOIN: вернутся только заказы, у которых есть клиент
SELECT o.order_id, c.customer_name
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id;

Ключевые характеристики INNER JOIN:

  • Результат: Только совпадающие строки из обеих таблиц.
  • Альтернативная запись: В большинстве СУБД JOIN без указания типа по умолчанию является INNER JOIN. Также устаревший синтаксис с перечислением таблиц в FROM и условием в WHERE (FROM A, B WHERE A.id = B.id) семантически эквивалентен INNER JOIN.
  • Использование: Когда необходимы данные, гарантированно существующие в обеих таблицах (например, получить список товаров, которые были хоть раз куплены).

LEFT JOIN (или LEFT OUTER JOIN)

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

-- Пример LEFT JOIN: вернутся ВСЕ клиенты, даже те, кто не делал заказов
SELECT c.customer_name, o.order_id
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id;
-- У клиентов без заказов в колонке order_id будет NULL

Ключевые характеристики LEFT JOIN:

  • Результат: Все строки из левой таблицы + совпадающие из правой. Данные правой таблицы могут быть NULL.
  • Вариация: RIGHT JOIN работает симметрично, возвращая все строки из правой таблицы. Однако на практике LEFT JOIN используется гораздо чаще, так как структуру запроса можно всегда переписать, поменяв таблицы местами.
  • Использование: Когда нужно получить основную сущность "вместе с" связанными данными, которые могут отсутствовать. Классические примеры:
    *   Получить список всех сотрудников и их проекты (даже если сотрудник пока не назначен на проект).
    *   Найти клиентов, которые никогда не делали заказов (через проверку `WHERE right_table.id IS NULL`).

Визуальная аналогия (Диаграммы Венна)

Если представить таблицы как множества строк:

  • INNER JOIN — это пересечение двух множеств (A ∩ B).
  • LEFT JOIN — это все левое множество целиком, включая его пересечение с правым (A ∪ (A ∩ B), что равно просто A).

Практический пример с результатом

Допустим, у нас есть таблицы:

Таблица departments:

idname
1IT
2Sales
3Marketing

Таблица employees:

idnamedepartment_id
1Alice1
2Bob1
3Carol2
4DaveNULL

Результат INNER JOIN (таблицы могут быть в любом порядке):

SELECT e.name, d.name AS department
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
namedepartment
AliceIT
BobIT
CarolSales
(Dave и отдел Marketing не попали в результат, так как для них нет полного соответствия)

Результат LEFT JOIN (все сотрудники из левой таблицы employees):

SELECT e.name, d.name AS department
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
namedepartment
AliceIT
BobIT
CarolSales
DaveNULL
(Dave есть, но его отдел — NULL. Marketing не появился, так как он не в левой таблице)

Вывод: Выбор между INNER JOIN и LEFT JOIN является смысловым и полностью зависит от бизнес-требований запроса: нужны ли только полные пары данных или необходимо сохранить все записи основной сущности, даже если связанные данные отсутствуют. Понимание этой разницы критически важно для написания корректных и эффективных SQL-запросов.

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