JOIN — одна из ключевых операций в SQL, позволяющая объединять данные из нескольких таблиц. Без понимания JOIN невозможно работать с реляционными базами данных.
Что такое JOIN?
JOIN соединяет строки из двух или более таблиц на основе связанного столбца. Представьте две таблицы: employees (сотрудники) и departments (отделы). У каждого сотрудника есть department_id, который указывает на его отдел.
INNER JOIN — пересечение
Возвращает только строки, которые имеют совпадения в обеих таблицах.
SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
Если у сотрудника нет отдела (NULL) или отдел не существует — строка не попадёт в результат.
LEFT JOIN — все из левой таблицы
Возвращает все строки из левой таблицы и совпадающие из правой. Если совпадения нет — правая часть заполняется NULL.
SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
Используйте LEFT JOIN когда нужны все записи из основной таблицы, даже если связанных данных нет.
RIGHT JOIN — все из правой таблицы
Аналогично LEFT JOIN, но приоритет у правой таблицы. На практике используется реже — обычно проще поменять таблицы местами и использовать LEFT JOIN.
SELECT e.name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.id;
FULL OUTER JOIN — объединение всего
Возвращает все строки из обеих таблиц. Где совпадений нет — заполняет NULL.
SELECT e.name, d.department_name
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.id;
Важно: MySQL не поддерживает FULL OUTER JOIN напрямую — используйте UNION из LEFT и RIGHT JOIN.
CROSS JOIN — декартово произведение
Каждая строка первой таблицы соединяется с каждой строкой второй. Результат: N × M строк.
SELECT e.name, p.project_name
FROM employees e
CROSS JOIN projects p;
Используется редко, но полезен для генерации комбинаций (например, все сотрудники × все месяцы).
SELF JOIN — таблица сама с собой
Соединение таблицы с самой собой. Классический пример — иерархия сотрудник-менеджер:
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
Типичные ошибки
- Забыли ON — без условия JOIN превращается в CROSS JOIN
- Дубликаты строк — если связь «один ко многим», строки дублируются. Используйте DISTINCT или GROUP BY
- NULL в условии — NULL ≠ NULL, поэтому строки с NULL не соединяются через обычный =
Какой JOIN выбрать?
- INNER JOIN — нужны только полные данные из обеих таблиц
- LEFT JOIN — нужны все записи основной таблицы + дополнительные данные
- FULL JOIN — нужен полный обзор обеих таблиц
- CROSS JOIN — генерация всех комбинаций