JOINНачальный
JOIN
Оператор, объединяющий строки из двух и более таблиц по условию связи между ними.
Синтаксис
SELECT ... FROM t1 [INNER|LEFT|RIGHT|FULL OUTER|CROSS] JOIN t2 ON t1.id = t2.t1_id;Объяснение
JOIN склеивает строки из нескольких таблиц в один результат на основе условия связи (чаще всего — совпадение внешнего ключа с первичным). Без JOIN пришлось бы делать отдельные запросы и соединять данные в коде.
INNER JOIN: только строки, у которых есть совпадение в обеих таблицах. Самый частый вариант — если не уверен, какой нужен, скорее всего этот.
LEFT JOIN: все строки левой таблицы, даже без пары справа (тогда NULL). Нужен, когда связь необязательна — например, пользователи без заказов.
RIGHT JOIN: зеркало LEFT JOIN. На практике почти не используется — обычно проще поменять таблицы местами и использовать LEFT JOIN.
FULL OUTER JOIN: все строки из обеих таблиц. Редко, но полезен для поиска несовпадений между двумя источниками данных.
CROSS JOIN: декартово произведение без условия ON — для генерации всех возможных комбинаций.
Производительность: колонка, по которой соединяешь, должна быть проиндексирована (обычно это foreign key) — без индекса JOIN превращается в перебор вложенными циклами O(n×m).
Пример
-- Самый частый случай: INNER JOIN
SELECT o.id, o.total, u.name, u.email
FROM orders o
JOIN users u ON u.id = o.user_id
WHERE o.status = 'paid';Связанные термины
CROSS JOINДекартово произведение двух таблиц: каждая строка первой соединяется с каждой строкой второй.FULL OUTER JOINВозвращает все строки из обеих таблиц. Где нет совпадения — NULL с соответствующей стороны.INNER JOINВозвращает только строки, у которых есть совпадение в обеих таблицах.LEFT JOINВозвращает все строки из левой таблицы. Для строк без пары в правой — NULL.RIGHT JOINВозвращает все строки из правой таблицы. Для строк без пары в левой — NULL.
Анекдоты по теме
ORM говорит SQL: — Милый, я скрываю твою сложность за красивыми объектами. SQL: — А я из-за тебя генерирую запросы с 50 JOIN, которые выполняются час.
— Мой JOIN работает уже 40 минут. — Сколько строк в таблицах? — По миллиону. — Индекс есть? — Нет. — Ну и жди ещё 40.
Преподаватель: — Чем отличается INNER JOIN от LEFT JOIN? Студент: — INNER JOIN — как друзья, которые общаются только если у них есть общие интересы. LEFT JOIN — как родственники: ты их не звал, но они всё равно есть.