Выбор ответа Middle Подзапросы и CTE спрашивают часто обновлено

NOT IN по подзапросу с NULL

Вопрос

В orders есть заказ с customer_id = NULL. Что вернёт запрос?

SELECT * FROM customers
WHERE id NOT IN (SELECT customer_id FROM orders);

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Ни одной строки. Если подзапрос вернул хотя бы один NULL, id NOT IN (...) для любого id даёт либо false, либо unknown, но никогда true.

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

  1. Ни одной строкиправильный ответ
  2. Клиентов без заказов
  3. Клиентов без заказов и гостевой заказ
  4. Ошибку из-за NULL в подзапросе

Разбор

Если подзапрос вернул хотя бы один NULL, id NOT IN (...) для любого id даёт либо false, либо unknown, но никогда true. Итог пустой, и без ошибки, что особенно коварно. Клиентов без заказов вернул бы NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id) или NOT IN с фильтром WHERE customer_id IS NOT NULL в подзапросе.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.