WHERE и HAVING — обе фильтрующие конструкции, но они работают на разных этапах выполнения запроса и служат разным целям.
SUM, COUNT, AVG)SELECT department, COUNT(*)
FROM employees
WHERE salary > 50000 -- фильтрует строки до группировки
GROUP BY department
GROUP BY и агрегацииSELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department
HAVING COUNT(*) > 10 -- фильтрует группы после агрегации
Когда обе конструкции присутствуют, SQL обрабатывает их в таком порядке:
WHERE — фильтрует отдельные строкиGROUP BY — группирует оставшиеся строкиHAVING — фильтрует полученные группыИспользуй WHERE для фильтрации исходных строк, а HAVING для фильтрации агрегированных результатов. Частая ошибка — попытка использовать агрегирующую функцию внутри WHERE, что приведёт к ошибке — такое условие должно быть в HAVING.
Предложение WHERE вычисляется после завершения операции GROUP BY, что позволяет ему фильтровать группы на основе результатов агрегатных функций.
Новый — ещё не проверен сообществом
Вы