Выбор ответа Middle Тестирование БД через SQL спрашивают часто обновлено

Поиск сирот через LEFT JOIN

Вопрос

Как найти заказы, у которых user_id указывает на несуществующего пользователя?

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

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

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

Коротко

Правильный ответ: SELECT o.id FROM orders o LEFT JOIN users u ON u.id = o.userid WHERE u.id IS NULL AND o.userid IS NOT NULL;. LEFT JOIN сохраняет все заказы, а там, где пользователь не нашёлся, колонки u равны NULL.

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

  1. SELECT o.id FROM orders o JOIN users u ON u.id = o.user_id WHERE u.id IS NULL AND o.user_id IS NOT NULL;
  2. SELECT o.id FROM orders o WHERE o.user_id IS NOT NULL AND o.user_id NOT IN (SELECT id FROM orders);
  3. SELECT o.id FROM orders o LEFT JOIN users u ON u.id = o.user_id WHERE o.user_id IS NULL AND u.id IS NULL;
  4. SELECT o.id FROM orders o LEFT JOIN users u ON u.id = o.user_id WHERE u.id IS NULL AND o.user_id IS NOT NULL;правильный ответ

Разбор

LEFT JOIN сохраняет все заказы, а там, где пользователь не нашёлся, колонки u равны NULL. INNER JOIN выбросит именно эти строки, и запрос всегда вернёт пусто. Подзапрос из orders сравнивает не с той таблицей. Условие o.user_id IS NULL ищет заказы без пользователя, а не со ссылкой в пустоту. Альтернатива: NOT EXISTS.

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

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

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