Ответ
Операторы WHERE
и HAVING
в SQL используются для фильтрации данных, но применяются на разных этапах выполнения запроса и имеют разные области действия.
-
WHERE
: Фильтрует отдельные строки до того, как они будут сгруппированы операторомGROUP BY
. Он применяется к исходным данным и не может использовать агрегатные функции (такие какCOUNT
,SUM
,AVG
,MAX
,MIN
). ИспользованиеWHERE
на этом этапе более эффективно, так как уменьшает объем данных, которые затем будут группироваться. -
HAVING
: Фильтрует группы строк после того, как они были сформированы операторомGROUP BY
. Он применяется к результатам агрегатных функций и может использовать их в своих условиях.
Пример:
-- Выбрать отделы, где средняя зарплата сотрудников, получающих более 50000, превышает 60000
SELECT department, AVG(salary) AS avg_salary
FROM employees
WHERE salary > 50000 -- Фильтрация отдельных сотрудников до группировки
GROUP BY department
HAVING AVG(salary) > 60000; -- Фильтрация групп по агрегированному значению
Ключевые отличия:
- Этап применения:
WHERE
— доGROUP BY
;HAVING
— послеGROUP BY
. - Объект фильтрации:
WHERE
— отдельные строки;HAVING
— группы строк. - Использование агрегатных функций:
WHERE
— нет;HAVING
— да. - Эффективность:
WHERE
более эффективен для первичной фильтрации, так как сокращает объем данных для дальнейшей обработки.