Ответ
Операторы 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более эффективен для первичной фильтрации, так как сокращает объем данных для дальнейшей обработки.