Выбор ответа Middle JOIN спрашивают часто обновлено
Фильтр по правой таблице LEFT JOIN в WHERE
Вопрос
Нужны все клиенты, а рядом их оплаченные заказы (у кого нет, NULL). Что не так с запросом?
SELECT c.name, o.id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'paid';
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: WHERE отбросит клиентов без оплаченных заказов. Для клиента без заказов o.status равен NULL, NULL = 'paid' даёт unknown, и WHERE выкидывает строку: LEFT JOIN фактически становится INNER.
Варианты ответа
- Ничего: запрос верный, NULL-заказы останутся
- WHERE отбросит клиентов без оплаченных заказовправильный ответ
- LEFT JOIN нельзя сочетать с WHERE, нужен HAVING
- Нужно заменить LEFT JOIN на RIGHT JOIN
Разбор
Для клиента без заказов o.status равен NULL, NULL = 'paid' даёт unknown, и WHERE выкидывает строку: LEFT JOIN фактически становится INNER. Условие на правую таблицу надо перенести в ON: LEFT JOIN orders o ON o.customer_id = c.id AND o.status = 'paid'. WHERE с LEFT JOIN сочетать можно, просто не так. RIGHT JOIN поменяет ведущую таблицу и тоже не решит задачу.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.