Встречается на 20% собеседований по PHP

Какие типы объединений есть в таблицах

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

Как это работает

JOIN выполняется после операций FROM и WHERE, но до GROUP BY, HAVING и ORDER BY. Синтаксически соединение задаётся в секции FROM с указанием типа JOIN и условия ON, которое определяет, как связаны таблицы. Например, INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID соединяет таблицы Orders и Customers по совпадению значений в столбце CustomerID.

Типы объединений

INNER JOIN

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

sql
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

LEFT JOIN (LEFT OUTER JOIN)

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

sql
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
LEFT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

RIGHT JOIN (RIGHT OUTER JOIN)

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

sql
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
RIGHT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

FULL JOIN (FULL OUTER JOIN)

Возвращает все строки из обеих таблиц. Если совпадения нет, недостающие значения заполняются NULL. В MySQL FULL JOIN отсутствует, но его можно эмулировать через UNION LEFT и RIGHT JOIN.

sql
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
FULL JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

CROSS JOIN

Создаёт декартово произведение: каждая строка первой таблицы соединяется с каждой строкой второй. Результат содержит X * Y строк, где X и Y — количество строк в таблицах. Используется редко, обычно для генерации комбинаций.

sql
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
CROSS JOIN Customers;

SELF JOIN

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

sql
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2
FROM Customers A, Customers B
WHERE A.CustomerID < B.CustomerID;

Подводные камни

  • NULL в JOIN: при использовании LEFT/RIGHT/FULL JOIN отсутствующие значения становятся NULL, что может вызвать неожиданные результаты в WHERE, если не учитывать проверку на NULL.
  • Производительность: INNER JOIN обычно быстрее, чем OUTER JOIN, так как обрабатывает меньше строк. CROSS JOIN может быть крайне ресурсоёмким на больших таблицах.
  • Синтаксис: в некоторых СУБД (например, MySQL) FULL JOIN не поддерживается напрямую, требуется эмуляция через UNION.
  • SELF JOIN: без правильных условий соединения легко получить декартово произведение, поэтому всегда задавайте условие в WHERE или ON.

Когда использовать

  • INNER JOIN — когда нужны только записи, имеющие соответствия в обеих таблицах (например, заказы с информацией о клиентах, где клиент существует).
  • LEFT JOIN — когда нужны все записи из основной таблицы, даже если связанных данных нет (например, список всех товаров с количеством продаж, включая товары без продаж).
  • RIGHT JOIN — используется реже, обычно когда основная таблица — правая (например, все клиенты и их заказы, включая клиентов без заказов).
  • FULL JOIN — когда нужно объединить все записи из обеих таблиц, показывая и сиротские записи (например, полный список сотрудников и отделов, включая отделы без сотрудников).
  • CROSS JOIN — для генерации комбинаций, например, всех возможных пар товаров.
  • SELF JOIN — для работы с иерархиями или сравнения строк в одной таблице (например, найти сотрудников, у которых зарплата выше, чем у их руководителя).

Коротко

  • Основные типы JOIN: INNER, LEFT, RIGHT, FULL, CROSS, SELF.
  • INNER JOIN возвращает только совпадающие строки; LEFT/RIGHT/FULL — все строки одной или обеих таблиц с NULL для отсутствующих совпадений.
  • CROSS JOIN — декартово произведение, SELF JOIN — соединение таблицы с собой.
  • Выбор JOIN зависит от того, какие данные нужны: только совпадающие, все из одной таблицы или все из обеих.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы