JOIN — одна из ключевых и поначалу пугающих тем в SQL. На деле идея простая: соединить данные из двух таблиц. Разберём основные виды JOIN на понятном примере.
Зачем нужен JOIN
Данные обычно разложены по разным таблицам, чтобы не дублировать информацию: например, таблица клиенты и таблица заказы. Чтобы получить «заказы вместе с именами клиентов», нужно связать таблицы по общему полю (ключу) — это и делает JOIN.
INNER JOIN — только совпадения
Самый частый вид. Возвращает строки, для которых нашлось соответствие в обеих таблицах:
SELECT orders.id, clients.name
FROM orders
INNER JOIN clients ON orders.client_id = clients.id;
Заказы без клиента и клиенты без заказов в результат не попадут.
LEFT JOIN — вся левая таблица
Возвращает все строки левой таблицы, а из правой — совпадения (где их нет, будут пустые значения NULL):
SELECT clients.name, orders.id
FROM clients
LEFT JOIN orders ON clients.id = orders.client_id;
Так вы увидите всех клиентов, включая тех, кто ещё не сделал ни одного заказа.
Другие виды кратко
- RIGHT JOIN — как LEFT, но берёт все строки правой таблицы (используется реже).
- FULL JOIN — все строки из обеих таблиц, совпавшие и нет.
- CROSS JOIN — каждая строка с каждой; применяется редко и осторожно.
Главное — условие ON
Сердце JOIN — условие соединения после ON: по какому полю связывать таблицы. Ошибка или пропуск условия приводит к неверным или огромным результатам. Всегда явно указывайте, какие ключи сопоставляются.
Частые ошибки
- Забывают условие ON и получают декартово произведение (все со всеми).
- Путают INNER и LEFT и «теряют» строки без пары.
- Соединяют по неправильному полю и получают лишние строки.
Что запомнить
JOIN связывает таблицы по общему ключу через условие ON. INNER JOIN оставляет только совпадения в обеих таблицах, LEFT JOIN — все строки левой плюс совпадения из правой (иначе NULL). Этих двух видов хватает для большинства задач. Главное — правильное условие соединения, иначе результат будет неверным.
Коротко: вопросы и ответы
Какой JOIN использовать чаще всего? INNER для совпадений и LEFT, когда нужна вся одна таблица.
Что такое NULL в результате LEFT JOIN? Признак, что для строки левой таблицы не нашлось пары в правой.
Почему запрос вернул слишком много строк? Часто из-за пропущенного или неверного условия ON.
Несколько JOIN в одном запросе
Часто нужно связать больше двух таблиц — например, заказы, клиентов и товары. Тогда JOIN пишут подряд: каждый следующий присоединяет новую таблицу по своему условию ON. Давайте таблицам короткие псевдонимы (алиасы) и указывайте, из какой таблицы каждое поле, чтобы не запутаться и не получить ошибку неоднозначного столбца.
JOIN замедляет запрос? На больших таблицах — может; помогают индексы по полям, участвующим в условии ON.
Комментарии