Пример ответа
1) Короткий ответWHERE
фильтрует строки до группировки, а HAVING
— после группировки, работая с результатами агрегатных функций.
4) Сравнение
Критерий | WHERE | HAVING |
---|---|---|
Время применения | До группировки ( | После группировки ( |
Работа с агрегатами | Не может использовать агрегатные функции ( | Может фильтровать по результатам агрегатных функций |
Производительность | Более эффективен, так как фильтрует данные раньше | Менее эффективен, так как фильтрует уже сгруппированные данные |
Порядок в запросе | После | После |
Рекомендация: Всегда используйте WHERE
для фильтрации по отдельным строкам, и только когда нужна фильтрация по результатам группировки (GROUP BY
) или агрегатным функциям — переходите на HAVING
.
5) Пример SQL
sql
Copy
Download
-- Фильтрация по отдельным строкам ДО группировки
SELECT department, AVG(salary) as avg_salary
FROM employees
WHERE salary > 1000 -- Фильтруем строки до группировки
GROUP BY department;
-- Фильтрация ПОСЛЕ группировки по результату агрегатной функции
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000; -- Фильтруем после группировки
6) Follow-up вопросы
Можно ли использовать AND/OR в HAVING? → Да, как в WHERE.
Что выполняется быстрее — WHERE или HAVING? → WHERE, меньше данных.
7) Практический совет
Напишите запрос, который использует оба условия:
WHERE
для предварительной фильтрации строк иHAVING
для фильтрации сгруппированных результатов.Проанализируйте свои SQL-запросы — если в
HAVING
есть условия, которые можно перенести вWHERE
, сделайте это для улучшения производительности.