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