Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице orders есть поля user_id, amount, status. Какой запрос корректен и наиболее эффективен?
A
SELECT user_id, SUM(amount) FROM orders GROUP BY user_id HAVING status = 'paid';B
SELECT user_id, SUM(amount) FROM orders WHERE status = 'paid' GROUP BY user_id;C
SELECT user_id, SUM(amount) FROM orders GROUP BY user_id WHERE status = 'paid';D
SELECT user_id, SUM(amount) FROM orders HAVING status = 'paid' GROUP BY user_id;Правильный ответ.
WHERE фильтрует строки до группировки, а HAVING — уже агрегированные группы.Разбор
Фильтрацию по обычному (не агрегированному) полю status лучше делать в WHERE, чтобы отбрасывать лишние строки до агрегации и не суммировать неоплаченные заказы. HAVING применяется уже к группам после GROUP BY и подходит для условий на агрегаты, например HAVING SUM(amount) > 1000. Варианты с HAVING status = 'paid' без агрегата формально могут отработать, но это менее эффективно и не отражает смысл оператора. Порядок GROUP BY ... WHERE синтаксически некорректен.
Проверь себя · 1/3разбор после ответа
Что делает оператор
HAVING в SQL-запросе с группировкой?Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»
- Что делает оператор `DISTINCT` в `SELECT`-запросе?
- Что делает оператор `HAVING` в SQL-запросе с группировкой?
- Есть таблица `orders(user_id, amount)`. Какой запрос посчитает сумму всех заказов по каждому пользователю?
- В таблице пользователей есть колонка `middle_name`, в которой часто хранится `NULL`. Что вернёт выражение `COUNT(middle_name)`?
- Нужно получить количество заказов по паре (`user_id`, `status`) из таблицы `orders`. Какой запрос верный?
- Все вопросы по «Агрегация, GROUP BY и HAVING» →