Выбор ответа Middle JOIN спрашивают часто обновлено
Как найти клиентов без заказов
Вопрос
В orders.customer_id встречается NULL (гостевые заказы). Какой запрос корректно найдёт клиентов без заказов?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: SELECT c. FROM customers c LEFT JOIN orders o ON o.customerid = c.id WHERE o.id IS NULL. LEFT JOIN с проверкой o.id IS NULL оставляет ровно тех, кому пары не нашлось (anti-join).
Варианты ответа
SELECT * FROM customers WHERE id NOT IN (SELECT customer_id FROM orders)SELECT c.* FROM customers c LEFT JOIN orders o ON o.customer_id = c.id WHERE o.id IS NULLправильный ответSELECT c.* FROM customers c JOIN orders o ON o.customer_id = c.id WHERE o.customer_id IS NULLSELECT c.* FROM customers c LEFT JOIN orders o ON o.customer_id <> c.id WHERE o.id IS NULL
Разбор
LEFT JOIN с проверкой o.id IS NULL оставляет ровно тех, кому пары не нашлось (anti-join). NOT IN при наличии NULL в подзапросе вернёт пустой результат. INNER JOIN с проверкой на NULL всегда пуст: после INNER JOIN у заказа есть ключ. Условие <> склеит клиента со всеми чужими заказами, и пустых пар почти не останется.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.