LEFT JOIN
Возвращает все строки из левой таблицы. Для строк без пары в правой — NULL.
SELECT ... FROM t1 LEFT JOIN t2 ON t1.id = t2.t1_id;
Объяснение
Пример
-- Все пользователи, даже без заказов 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;
Связанные термины
Анекдоты по теме
ORM говорит SQL: — Милый, я скрываю твою сложность за красивыми объектами. SQL: — А я из-за тебя генерирую запросы с 50 JOIN, которые выполняются час.
— Зачем нужен ANTI JOIN? — Найти строки из левой таблицы, которых НЕТ в правой. — Пример? — Пользователи без заказов: SELECT u.* FROM users u WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id); — Или через LEFT JOIN WHERE o.id IS NULL.
Рекурсивный CTE для иерархии: WITH RECURSIVE tree AS ( SELECT id, name, parent_id, 0 AS depth FROM categories WHERE parent_id IS NULL UNION ALL SELECT c.id, c.name, c.parent_id, t.depth + 1 FROM categories c JOIN tree t ON c.parent_id = t.id ) SELECT * FROM tree ORDER BY depth, name; Программист: это чище чем 10 JOIN!