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;