Выбор ответа Middle SQL для аналитика спрашивают часто обновлено

LEFT JOIN и условие в WHERE

Вопрос

Нужны все клиенты и их доставленные заказы (у кого нет, NULL). Почему запрос ... LEFT JOIN orders o ON o.client_id = c.id WHERE o.status = 'delivered' неверен?

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

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

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

Коротко

Правильный ответ: WHERE отбрасывает NULL справа, и LEFT JOIN стал INNER. Для клиента без доставленных заказов o.status будет NULL, а NULL = 'delivered' не true, строка выбрасывается.

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

  1. Запрос верен: LEFT JOIN сохранит всех клиентов
  2. Условие на статус должно стоять в HAVING, а не в WHERE
  3. WHERE отбрасывает NULL справа, и LEFT JOIN стал INNERправильный ответ
  4. LEFT JOIN нельзя комбинировать с WHERE вообще

Разбор

Для клиента без доставленных заказов o.status будет NULL, а NULL = 'delivered' не true, строка выбрасывается. Условие на правую таблицу переносят в ON: тогда клиенты сохранятся. WHERE с LEFT JOIN использовать можно, просто не для фильтра правой стороны. HAVING тут ни при чём.

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

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