Какие типы 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 — это основа работы с реляционными базами данных. Понимание различий между типами соединений позволяет писать оптимальные запросы и строить эффективные схемы хранения данных.