JOINНачальный
LEFT JOIN
Возвращает все строки из левой таблицы. Для строк без пары в правой — NULL.
Синтаксис
SELECT ... FROM t1 LEFT JOIN t2 ON t1.id = t2.t1_id;Объяснение
LEFT JOIN (= LEFT OUTER JOIN) — второй по популярности тип соединения. Гарантирует, что все строки левой таблицы попадут в результат.
Часто используется для:
- Поиска «осиротевших» записей: WHERE right.id IS NULL
- Опциональных связей: пользователь может иметь профиль, а может не иметь
Пример
-- Все пользователи, даже без заказов
SELECT u.name, COUNT(o.id) AS orders_count
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id, u.name;
-- Пользователи БЕЗ заказов
SELECT u.* FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL;Связанные термины
FULL OUTER JOINВозвращает все строки из обеих таблиц. Где нет совпадения — NULL с соответствующей стороны.INNER JOINВозвращает только строки, у которых есть совпадение в обеих таблицах.NULL / IS NULLNULL означает отсутствие значения. Для проверки используется IS NULL, а не = NULL.RIGHT JOINВозвращает все строки из правой таблицы. Для строк без пары в левой — NULL.
Анекдоты по теме
Собеседование: — Что быстрее: JOIN или подзапрос? Ответ: зависит от оптимизатора, размера данных и индексов. Интервьюер: правильный ответ. Кандидат: но это же уход от ответа! Интервьюер: нет. Это понимание того, что серебряных пуль не существует.
Собеседование. Спрашивают: — В чём разница между LEFT JOIN и LEFT OUTER JOIN? Кандидат молчит 10 секунд. — Это одно и то же. Интервьюер: — Правильно. Просто хотел посмотреть на твоё лицо.
Подзапрос говорит JOIN: — Я тоже могу соединять таблицы! JOIN: — Но я делаю это один раз. Подзапрос: — Зато я более читаем! OPTIMIZER: — На самом деле я часто превращаю подзапросы в JOIN сам.