Выбор ответа 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.

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

  1. Ничего: запрос верный, NULL-заказы останутся
  2. WHERE отбросит клиентов без оплаченных заказовправильный ответ
  3. LEFT JOIN нельзя сочетать с WHERE, нужен HAVING
  4. Нужно заменить 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 ошибок.

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