Выбор ответа 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.
Варианты ответа
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;SELECT o.id FROM orders o WHERE o.user_id IS NOT NULL AND o.user_id NOT IN (SELECT id FROM orders);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;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 ошибок.