Вопрос проверяет понимание различий между фильтрацией строк и агрегированных групп в SQL, что важно для корректного формирования аналитических отчётов.
В SQL для работы с агрегированными данными, такими как суммы, средние значения или количество записей в группах, используется комбинация операторов GROUP BY и агрегатных функций. Однако часто возникает необходимость отобрать не все группы, а только те, которые удовлетворяют определённому условию по результату агрегации. Именно для этой цели служит оператор HAVING.
Основная путаница возникает между WHERE и HAVING. Оператор WHERE фильтрует отдельные строки таблицы до того, как они будут сгруппированы. Он не может содержать агрегатные функции. Напротив, HAVING фильтрует группы строк после выполнения группировки GROUP BY и может использовать условия, основанные на результатах агрегатных функций (например, SUM(price) > 1000).
Типичный запрос с агрегацией и фильтрацией выглядит так:
SELECT department_id, AVG(salary) as avg_salary
FROM employees
WHERE hire_date > '2020-01-01' -- Фильтрация строк ДО группировки
GROUP BY department_id
HAVING AVG(salary) > 50000 -- Фильтрация групп ПОСЛЕ группировки
ORDER BY avg_salary DESC;Порядок выполнения логических секций в этом запросе: FROM -> WHERE -> GROUP BY -> агрегатные функции -> HAVING -> SELECT -> ORDER BY. Условие в HAVING может ссылаться на псевдонимы столбцов из SELECT (например, HAVING avg_salary > 50000), но это зависит от конкретной СУБД.
HAVING часто используется в бизнес-аналитике и отчётности. Например:
Пример запроса для поиска активных клиентов:
SELECT customer_id, COUNT(order_id) as order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) >= 5;Вывод: Оператор HAVING — это необходимый инструмент для фильтрации данных на уровне групп в аналитических SQL-запросах. Его следует применять, когда условие отбора зависит от результата агрегатной функции (суммы, среднего, количества), а не от значений отдельных строк.