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

Какие типы JOIN существуют в SQL? Объясните разницу между INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL OUTER JOIN.?

2.0 Middle🔥 211 комментариев
#Entity Framework и ORM#Базы данных и SQL

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

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

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

Типы JOIN в SQL и их различия

В SQL оператор JOIN используется для объединения строк из двух или более таблиц на основе связанного столбца между ними. Основные типы JOIN включают INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL OUTER JOIN. Каждый из них имеет уникальную логику работы и применяется в разных сценариях.

Основные типы JOIN

1. INNER JOIN

INNER JOIN возвращает только те строки, где есть соответствие в обеих таблицах. Это самый распространенный тип соединения.

SELECT *
FROM ТаблицаA
INNER JOIN ТаблицаB
ON ТаблицаA.ключ = ТаблицаB.ключ;

Логика: Возвращаются только строки, где значение ключа существует в ТаблицаA и ТаблицаB. Строки без соответствия исключаются.

2. LEFT JOIN (или LEFT OUTER JOIN)

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

SELECT *
FROM ТаблицаA
LEFT JOIN ТаблицаB
ON ТаблицаA.ключ = ТаблицаB.ключ;

Логика: Все строки из ТаблицаA включаются в результат. Для каждой строки из ТаблицаA проверяется наличие соответствия в ТаблицаB. При отсутствии соответствия столбцы ТаблицаB заполняются NULL.

3. RIGHT JOIN (или RIGHT OUTER JOIN)

RIGHT JOIN является зеркальным отражением LEFT JOIN. Он возвращает все строки из правой таблицы и соответствующие строки из левой таблицы. При отсутствии соответствия левые столбцы заполняются NULL.

SELECT *
FROM ТаблицаA
RIGHT JOIN ТаблицаB
ON ТаблицаA.ключ = ТаблицаB.ключ;

Логика: Все строки из ТаблицаB включаются в результат. Для каждой строки из ТаблицаB проверяется соответствие в ТаблицаA. При отсутствии левые столбцы становятся NULL.

4. FULL OUTER JOIN

FULL OUTER JOIN возвращает все строки из обеих таблиц, объединяя их по соответствию. Если соответствия нет в одной из таблиц, недостающие столбцы заполняются NULL.

SELECT *
FROM ТаблицаA
FULL OUTER JOIN ТаблицаB
ON ТаблицаA.ключ = ТаблицаB.ключ;

Логика: Результат включает:

  • Строки с соответствием из обеих таблиц.
  • Строки без соответствия из левой таблицы с NULL для правых столбцов.
  • Строки без соответствия из правой таблицы с NULL для левых столбцов.

Сравнение и практическое применение

INNER JOIN используется для получения только связанных данных, например, список клиентов с их заказами:

SELECT Customers.Name, Orders.OrderDate
FROM Customers
INNER JOIN Orders ON Customers.Id = Orders.CustomerId;

LEFT JOIN часто применяется для анализа данных с возможными отсутствующими связями, например, все клиенты и их заказы (включая клиентов без заказов):

SELECT Customers.Name, Orders.OrderDate
FROM Customers
LEFT JOIN Orders ON Customers.Id = Orders.CustomerId;

RIGHT JOIN менее распространен, поскольку обычно можно переставить таблицы и использовать LEFT JOIN. Однако он полезен при особых требованиях к порядку таблиц.

FULL OUTER JOIN используется для полного объединения данных, например, при сравнении двух списков для выявления различий:

SELECT *
FROM СтарыеДанные
FULL OUTER JOIN НовыеДанные
ON СтарыеДанные.Id = НовыеДанные.Id;

Ключевые различия в таблице

Тип JOINВозвращает данные из левой таблицыВозвращает данные из правой таблицыВозвращает строки без соответствия
INNER JOINТолько при соответствииТолько при соответствииНет
LEFT JOINВсе строкиТолько при соответствииИз левой таблицы
RIGHT JOINТолько при соответствииВсе строкиИз правой таблицы
FULL OUTER JOINВсе строкиВсе строкиИз обеих таблиц

Визуализация: Часто JOIN представляют как диаграммы Venn, где:

  • INNER JOIN – пересечение двух кругов.
  • LEFT JOIN – весь левый круг + пересечение.
  • RIGHT JOIN – весь правый круг + пересечение.
  • FULL OUTER JOIN – объединение двух кругов.

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