JuniorКодЧастоЕщё не отвечали
Запрос клиентов, не сделавших ни одного заказа
Верните каждого клиента, у которого нет соответствующей строки в таблице заказов.
-- Customers(id, name)
-- Orders(id, customer_id)
-- напишите ваш запрос здесь
Напишите запрос.
Сделайте left join с заказами и оставьте несопоставленные строки: SELECT c.id, c.name FROM Customers c LEFT JOIN Orders o ON c.id = o.customer_id WHERE o.customer_id IS NULL. Анти-join LEFT JOIN ... IS NULL оставляет ровно тех клиентов, у кого нет подходящего заказа.
- ✗Использовать
!=в условии join в смысле «нет совпадения» - ✗Доверять
NOT IN, когда подзапрос может содержать NULL - ✗Делать inner join (который выбрасывает клиентов без заказов), затем считать ноль
- →Почему
NOT INможет дать неверный результат, когда подзапрос возвращает NULL? - →Как
NOT EXISTSвыражает тот же анти-join безопасно?
Оглавление
Задача
Верните клиентов из Customers, у которых нет ни одной строки в Orders.
Решение
SELECT c.id, c.name
FROM Customers c
LEFT JOIN Orders o ON c.id = o.customer_id
WHERE o.customer_id IS NULL;
Ключевые моменты
LEFT JOINсохраняет всех клиентов; несопоставленные получаютNULLна стороне заказов.WHERE o.customer_id IS NULLоставляет именно тех, у кого заказов нет — анти-join.NOT EXISTS— безопасная альтернатива;NOT INломается приNULLв подзапросе.
Оглавление