Выбор ответа 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.
Варианты ответа
- Ни одной строкиправильный ответ
- Клиентов без заказов
- Клиентов без заказов и гостевой заказ
- Ошибку из-за 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 ошибок.
Термины по теме
Ещё по теме «Подзапросы и CTE»
- Полный путь категории в дереве
- Клиенты, у которых все заказы оплачены
- Дни без продаж по регионам
- Цепочка руководителей вверх по дереву
- Дороже любой книги: ALL против MAX
- Категория с максимальной выручкой
- Два последних заказа каждого клиента через LATERAL
- Дороже среднего по своей категории