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) позволяет планировщику брать только нужные строки. Без него PostgreSQL читает таблицу целиком (Seq Scan) и обычно выбирает Hash Join — на больших таблицах это заметно медленнее.
Пример
-- Самый частый случай: 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.
Анекдоты по теме
— Как проверить, понимаешь ли ты SQL? — Попробуй объяснить бабушке разницу между LEFT JOIN и RIGHT JOIN. Если она поймёт — ты профи. Если нет — учи дальше.
Что общего между FULL OUTER JOIN и семейной встречей? Приходят все. И те, кого ждали, и те, кого нет. А если с одной стороны никого — всё равно место за столом будет.
— Что такое SELF JOIN? — Таблица, которая джойнится сама с собой. — Зачем? — Найти всех сотрудников и их менеджеров из одной таблицы employees: SELECT e.name, m.name AS manager FROM employees e JOIN employees m ON e.manager_id = m.id;