Ответ
HAVING используется для фильтрации результатов после применения агрегатных функций (COUNT, SUM, AVG, MAX, MIN) и группировки (GROUP BY). WHERE фильтрует отдельные строки до группировки и агрегации.
Синтаксический порядок:
SELECT column1, AGGREGATE_FUNCTION(column2)
FROM table
WHERE condition_on_rows -- Фильтрация строк ДО группировки
GROUP BY column1
HAVING condition_on_group -- Фильтрация групп ПОСЛЕ агрегации
Пример: Найти отделы с более чем 5 сотрудниками и средней зарплатой выше 50000.
SELECT
department_id,
COUNT(*) AS employee_count,
AVG(salary) AS avg_salary
FROM employees
WHERE active = TRUE -- Учитываем только активных сотрудников (фильтр строк)
GROUP BY department_id
HAVING
COUNT(*) > 5
AND AVG(salary) > 50000; -- Фильтр по результатам агрегации
Ключевые правила:
- WHERE не может содержать агрегатные функции.
- HAVING может содержать как агрегатные функции, так и обычные колонки из
GROUP BY. - HAVING применяется после
GROUP BY,WHERE— до.
Когда использовать HAVING:
- Нужно отфильтровать итоговые группы по результату вычислений (например, "отделы, где сумма продаж > 1M").
- Условие включает агрегатную функцию (
SUM(amount) > 1000).