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.
Анекдоты по теме
— Что такое SELF JOIN? — Таблица, которая джойнится сама с собой. — Зачем? — Найти всех сотрудников и их менеджеров из одной таблицы employees: SELECT e.name, m.name AS manager FROM employees e JOIN employees m ON e.manager_id = m.id;
— Мой запрос вернул NULL. — Проверь JOIN. — Там NULL. — Проверь WHERE. — Там тоже NULL. — Ты уверен, что база вообще существует? — COALESCE(база, 'не знаю').
Оптимизатор запросов видит запрос с 7 JOIN. Оптимизатор: интересно. Оптимизатор перебирает 5040 возможных порядков соединения. Оптимизатор: выбираю лучший. Разработчик: почему запрос планируется 2 секунды? Оптимизатор: ты написал 7 JOIN.