Выбор ответа 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).

Варианты ответа

  1. SELECT * FROM customers WHERE id NOT IN (SELECT customer_id FROM orders)
  2. SELECT c.* FROM customers c LEFT JOIN orders o ON o.customer_id = c.id WHERE o.id IS NULLправильный ответ
  3. SELECT c.* FROM customers c JOIN orders o ON o.customer_id = c.id WHERE o.customer_id IS NULL
  4. SELECT 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 ошибок.

Термины по теме