Запрос фильтрует по created_at > '2024-01-01' и SUM(amount) > 1000. Как правильно расставить эти условия?

AУсловие created_at > '2024-01-01' — в WHERE, а SUM(amount) > 1000 — в HAVING
BОба условия можно поставить в HAVING — оптимизатор сам перенесёт их в WHERE
CОба условия поставить в WHEREHAVING нужен только для строковых фильтров
DУсловие SUM(amount) > 1000 — в WHERE, а created_at > '2024-01-01' — в HAVING
Правильный ответ. Неагрегированное условие created_at ставят в WHERE — оно уменьшает данные до группировки. Условие на агрегат SUM(amount) можно разместить только в HAVING.

Разбор

Логический порядок: WHEREGROUP BYHAVING. Условие на не-агрегированный столбец в WHERE отсекает строки до группировки — меньше данных обрабатывается. Условие SUM(amount) > 1000 невозможно вынести в WHERE, так как агрегат ещё не вычислен на этом этапе — оно должно быть в HAVING. Размещение агрегатного условия в WHERE приведёт к синтаксической ошибке.

Проверь себя · 1/3разбор после ответа
В таблице users есть колонка middle_name, в которой часто хранится NULL. Что вернёт выражение COUNT(middle_name)?
Тренировать SQL в Telegram

Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»