Запрос 1: SELECT * FROM users u LEFT JOIN orders o ON o.user_id = u.id WHERE o.amount > 1000. Запрос 2: SELECT * FROM users u LEFT JOIN orders o ON o.user_id = u.id AND o.amount > 1000. Чем отличаются результаты?

AОба запроса вернут одинаковый результат: всех пользователей и их заказы на сумму строго больше 1000 рублей
BПервый запрос вернёт ошибку: условия на правую таблицу в блоке WHERE после LEFT JOIN записывать недопустимо
CПервый запрос отбросит пользователей без подходящих заказов, второй сохранит их со значением NULL в колонках
DПервый запрос сохранит всех пользователей с NULL в заказах, а второй превратит соединение во INNER JOIN
Правильный ответ. Условие на правую таблицу в WHERE после левого соединения отфильтрует пользователей без заказов, а в ON — сохранит их со значениями NULL.

Разбор

При левом соединении сначала выполняется условие из ON, а затем к результату добавляются строки из левой таблицы без пары — в правых столбцах будет NULL. Если условие на сумму стоит в WHERE, строки с NULL отфильтруются и левое соединение фактически превратится во внутреннее. Если же условие живёт в ON, оно сужает только подбор пар, а пользователи без подходящих заказов всё равно останутся в результате со значениями NULL. Это типичная ловушка с фильтрами по правой таблице при левом соединении.

Проверь себя · 1/3разбор после ответа
Аналитик переписал запрос, поменяв порядок таблиц в цепочке JOIN. Запрос стал выполняться быстрее. Почему это могло произойти?
Тренировать SQL в Telegram

Ещё вопросы по теме «JOIN и операции множеств»