Запрос фильтрует по created_at > '2024-01-01' и SUM(amount) > 1000. Как правильно расставить эти условия?
AОба условия можно ставить в
HAVING: оптимизатор сам перенесёт фильтр по created_at в WHERE до GROUP BYBОба условия ставятся в
WHERE: HAVING нужен только для строковых фильтров и сравнений через LIKECУсловие
SUM(amount) > 1000 в WHERE, а created_at > '2024-01-01' в HAVING после GROUP BYDУсловие
created_at > '2024-01-01' в WHERE, а SUM(amount) > 1000 в HAVING после GROUP BYПравильный ответ. Неагрегированное условие
created_at ставят в WHERE — оно уменьшает данные до группировки. Условие на агрегат SUM(amount) можно разместить только в HAVING.Разбор
Логический порядок: WHERE → GROUP BY → HAVING. Условие на не-агрегированный столбец в WHERE отсекает строки до группировки — меньше данных обрабатывается. Условие SUM(amount) > 1000 невозможно вынести в WHERE, так как агрегат ещё не вычислен на этом этапе — оно должно быть в HAVING. Размещение агрегатного условия в WHERE приведёт к синтаксической ошибке.
Проверь себя · 1/3разбор после ответа
Как
GROUP BY обрабатывает значения NULL в столбце группировки?Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»
- Что делает оператор `DISTINCT` в `SELECT`-запросе?
- Что делает оператор `HAVING` в SQL-запросе с группировкой?
- Есть таблица `orders(user_id, amount)`. Какой запрос посчитает сумму всех заказов по каждому пользователю?
- Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице `orders` есть поля `user_id`, `amount`, `status`. Какой запрос корректен и наиболее эффективен?
- В таблице пользователей есть колонка `middle_name`, в которой часто хранится `NULL`. Что вернёт выражение `COUNT(middle_name)`?
- Все вопросы по «Агрегация, GROUP BY и HAVING» →