HAVING
в PostgreSQL используется для фильтрации результатов после группировки данных с GROUP BY
. В отличие от WHERE
, который фильтрует строки до группировки, HAVING
применяется к агрегированным данным.
Фильтрация групп после GROUP BY
Выбор возрастных групп, в которых количество пользователей больше 5:
SELECT age, COUNT(*) FROM users GROUP BY age HAVING COUNT(*) > 5;
Сначала выполняется группировка по age
, затем HAVING
фильтрует группы, оставляя только те, где COUNT(*) > 5
.
Использование с разными агрегатными функциями
Пример выбора городов, где средний возраст пользователей больше 30:
SELECT city, AVG(age) FROM users GROUP BY city HAVING AVG(age) > 30;
Пример выбора товаров с суммарной продажей выше 1000 единиц:
SELECT product_id, SUM(quantity) FROM sales GROUP BY product_id HAVING SUM(quantity) > 1000;
Комбинирование HAVING
и WHERE
WHERE
фильтрует строки перед группировкой, а HAVING
— после. Например, выбор пользователей старше 18 лет и группировка по городу с фильтрацией городов, где более 10 пользователей:
SELECT city, COUNT(*) FROM users WHERE age > 18 GROUP BY city HAVING COUNT(*) > 10;