Ответ
Оператор HAVING применяется для фильтрации групп записей, созданных оператором GROUP BY, на основе условий, включающих агрегатные функции (COUNT, SUM, AVG, MAX, MIN).
Ключевое отличие от WHERE:
WHEREфильтрует отдельные строки до их группировки.HAVINGфильтрует целые группы после выполнения группировки и агрегации.
Пример: Найти отделы со средней зарплатой сотрудников выше 70 000 и численностью более 5 человек.
SELECT
department_id,
COUNT(*) AS employee_count,
AVG(salary) AS average_salary
FROM employees
WHERE active = TRUE -- Фильтрация строк ДО группировки
GROUP BY department_id
HAVING
AVG(salary) > 70000 AND -- Условие по агрегатной функции
COUNT(*) > 5; -- Еще одно условие по агрегатной функции
Типичные сценарии использования HAVING:
- Фильтрация по агрегированным значениям: Отбор групп, где сумма, среднее или максимум превышает заданный порог.
- Фильтрация по количеству элементов в группе: Найти категории товаров с более чем N заказами, пользователей, совершивших более M транзакций.
- Анализ данных после JOIN: Фильтрация результатов сложных запросов с соединениями и группировкой.
Важно: В условии HAVING можно использовать как агрегатные функции, так и столбцы, по которым выполнена группировка (GROUP BY).