Ответ
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.