Какие типы JOIN существуют в SQL?

В SQL JOIN — это операция объединения строк из двух или более таблиц на основе логического условия, обычно совпадения значений в определённых столбцах. Она позволяет работать с разрозненными, но логически связанными данными, сохраняя при этом структуру нормализованной базы данных.

Существует несколько видов JOIN, и каждый из них играет свою роль в зависимости от цели запроса и необходимого результата. Ниже подробно описаны все основные типы соединений, их поведение и примеры.

1. INNER JOIN (внутреннее соединение)

Возвращает только те строки, которые удовлетворяют условию соединения — то есть строки, у которых совпадают значения в обеих таблицах.

Синтаксис:

SELECT \*
FROM Customers AS c
INNER JOIN Orders AS o ON c.CustomerID = o.CustomerID;

Поведение:

  • Только совпадающие записи (Matching Rows)

  • Если хотя бы в одной из таблиц нет соответствия, строка не попадает в результат

Пример:

Если у клиента не было заказов, он не будет показан.

2. LEFT JOIN (или LEFT OUTER JOIN) — левое внешнее соединение

Возвращает все строки из левой таблицы и совпадающие строки из правой. Если совпадений нет, в столбцах правой таблицы будут NULL.

Синтаксис:

SELECT \*
FROM Customers AS c
LEFT JOIN Orders AS o ON c.CustomerID = o.CustomerID;

Поведение:

  • Все строки из левой таблицы

  • Если нет совпадения — NULL в колонках правой таблицы

Пример:

Показывает всех клиентов, даже если у них нет заказов.

3. RIGHT JOIN (или RIGHT OUTER JOIN) — правое внешнее соединение

Аналогично LEFT JOIN, но возвращаются все строки из правой таблицы и только совпадающие — из левой.

Синтаксис:

SELECT \*
FROM Orders AS o
RIGHT JOIN Customers AS c ON c.CustomerID = o.CustomerID;

Поведение:

  • Все строки из правой таблицы

  • NULL в левой таблице при отсутствии совпадения

4. FULL JOIN (или FULL OUTER JOIN) — полное внешнее соединение

Возвращает все строки из обеих таблиц: совпадающие — как есть, не совпадающие — с NULL в недостающих столбцах.

Синтаксис (PostgreSQL, SQL Server):

SELECT \*
FROM Customers AS c
FULL OUTER JOIN Orders AS o ON c.CustomerID = o.CustomerID;

Поведение:

  • Все совпадения

  • Все записи из левой и правой таблиц, даже если совпадений нет

Примечание:

MySQL не поддерживает FULL OUTER JOIN напрямую, но его можно эмулировать через UNION двух LEFT JOIN и RIGHT JOIN.

5. CROSS JOIN — декартово произведение

Каждая строка из первой таблицы соединяется с каждой строкой из второй. Используется редко, например, в генерации комбинаций или тестовых данных.

Синтаксис:

SELECT \*
FROM Products
CROSS JOIN Categories;

Поведение:

  • Результат содержит N * M строк (если в одной таблице 5 строк, в другой — 10, будет 50 строк)

6. SELF JOIN — соединение таблицы с самой собой

Используется, когда строки таблицы логически связаны между собой (например, подчинённые и начальники в одной таблице сотрудников).

Синтаксис:

SELECT A.Name AS Employee, B.Name AS Manager
FROM Employees AS A
LEFT JOIN Employees AS B ON A.ManagerID = B.EmployeeID;

Поведение:

  • Работает как обычный JOIN, но таблица участвует в соединении дважды с разными псевдонимами

7. NATURAL JOIN — естественное соединение

Автоматически соединяет таблицы по всем столбцам с одинаковыми именами. Не требует явного указания ON.

Синтаксис:

SELECT \*
FROM Orders
NATURAL JOIN Customers;

Поведение:

  • Использует все общие по названию колонки

  • Упрощает запрос, но может быть небезопасным при добавлении новых колонок

8. USING — соединение по одному или нескольким столбцам

Вместо полного условия соединения ON table1.col = table2.col, используется конструкция USING(column).

Синтаксис:

SELECT \*
FROM Customers
JOIN Orders USING(CustomerID);

Поведение:

  • Удобен при совпадении имён колонок

  • Поддерживается не во всех СУБД одинаково (например, PostgreSQL, MySQL)

Таблица сравнения поведения JOIN-ов:

Тип JOIN Возвращает совпадения Возвращает не совпадающие из левой из правой
INNER JOIN
--- --- --- ---
LEFT JOIN
--- --- --- ---
RIGHT JOIN
--- --- --- ---
FULL JOIN
--- --- --- ---
CROSS JOIN Все комбинации
--- --- --- ---

Особенности и оптимизация

  • Используйте JOIN только по проиндексированным ключам — это ускоряет выполнение.

  • Применяйте JOIN с условиями фильтрации (WHERE) для ограничения результатов.

  • Для больших таблиц следует использовать EXPLAIN (MySQL/PostgreSQL) или Execution Plan (SQL Server) — они покажут, какой тип соединения применяется и насколько он эффективен.

  • Старайтесь не использовать SELECT *, особенно в JOIN с несколькими таблицами — это ведёт к дублированию и лишней нагрузке.

SQL JOIN — это основа работы с реляционными базами данных. Понимание различий между типами соединений позволяет писать оптимальные запросы и строить эффективные схемы хранения данных.