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

«Какие типы JOIN существуют в SQL?» — вопрос из категории Базы данных, который задают на 24% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

SQL поддерживает несколько типов JOIN для гибкого объединения данных. Вот основные из них с пояснениями:

Тип JOIN Описание Визуальная аналогия (Венн-диаграмма)
INNER JOIN Только совпадающие строки из обеих таблиц. Пересечение двух множеств.
LEFT JOIN Все строки из левой таблицы + совпадения справа. NULL для правой, если совпадения нет. Все левое множество + пересечение.
RIGHT JOIN Все строки из правой таблицы + совпадения слева. NULL для левой, если совпадения нет. Все правое множество + пересечение.
FULL JOIN Все строки из обеих таблиц. NULL с той стороны, где совпадения нет. Объединение двух множеств.
CROSS JOIN Декартово произведение: каждая строка из таблицы A со всеми строками из таблицы B. Матрица всех комбинаций.

Примеры синтаксиса

-- INNER JOIN (явный синтаксис)
SELECT * FROM orders INNER JOIN customers ON orders.customer_id = customers.id;

-- LEFT JOIN (чаще всего используется для "главных" записей)
SELECT employees.name, projects.title
FROM employees
LEFT JOIN assignments ON employees.id = assignments.employee_id
LEFT JOIN projects ON assignments.project_id = projects.id;

-- CROSS JOIN (полезен для генерации данных)
SELECT product, quarter FROM products CROSS JOIN (VALUES ('Q1'), ('Q2'), ('Q3'), ('Q4')) AS quarters(quarter);

-- SELF JOIN (для иерархий)
SELECT worker.name AS Employee, manager.name AS ReportsTo
FROM staff worker
LEFT JOIN staff manager ON worker.manager_id = manager.id;

Ключевой момент: Выбор типа JOIN напрямую влияет на полноту результата. INNER JOIN фильтрует данные, а OUTER JOIN (LEFT/RIGHT/FULL) сохраняет все записи из одной или обеих таблиц, дополняя недостающие данные NULL.