Запрос 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Первый запрос вернёт ошибку — в ON нельзя добавлять условия на столбцы правой таблицы
CПервый запрос отбросит пользователей без заказов — WHERE после LEFT JOIN превращает его в INNER
DПервый запрос уберёт всех пользователей без заказов, а второй сохранит их с NULL в столбцах заказа
Правильный ответ. Условие в WHERE после LEFT JOIN отфильтрует строки с NULL — пользователи без заказов пропадут. Условие в ON ограничит только соединение, сохранив всех пользователей.

Разбор

При LEFT JOIN сначала выполняется соединение по ON, затем добавляются строки из левой таблицы без пар — с NULL в правых столбцах. Если o.amount > 1000 стоит в WHERE, строки с NULL (пользователи без подходящих заказов) отфильтруются — LEFT JOIN фактически станет INNER JOIN. Если условие в ON, оно влияет только на подбор пар, а пользователи без совпадений останутся с NULL.

Проверь себя · 1/3разбор после ответа
Нужно построить отчёт: по каждому продукту и каждому дню месяца — сумма продаж, включая дни с нулевыми продажами. Как сформировать каркас из всех пар дата-продукт?
Тренировать SQL в Telegram

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