HAVING в Oracle SQL — как фильтровать группы после агрегации

🟢 HAVING в Oracle SQL. Введение

HAVING используется когда вы группируете данные с помощью GROUP BY и нужно отфильтровать полученные группы — например, выбрать только те, где сумма больше определённого значения.

HAVING работает после группировки, в отличие от WHERE, который фильтрует строки до неё. Это делает HAVING незаменимым при работе с агрегатами (SUM(), AVG(), COUNT() и т.д.).


🔤 Написание

sql
SELECT столбец, агрегатная_функция
FROM таблица
GROUP BY столбец
HAVING агрегатная_функция > значение;

🔄 Где используется HAVING

  • Фильтрация агрегированных данных

  • Условие на группы: например, только департаменты с более чем 5 сотрудниками

  • Совместно с GROUP BY, ORDER BY

  • Работа в отчётных и аналитических запросах


🧪 10 Примеров использования H A V I N G

1️⃣ Группы с количеством > 10

sql
SELECT department_id, COUNT(*) AS emp_count
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 10;

2️⃣ Средняя зарплата по должности > 5000

sql
SELECT job_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY job_id
HAVING AVG(salary) > 5000;

3️⃣ Использование нескольких условий в H A V I N G

sql
SELECT department_id, SUM(salary) AS total_salary
FROM employees
GROUP BY department_id
HAVING SUM(salary) > 20000 AND COUNT(*) > 3;

4️⃣ HAVING с псевдонимом агрегата (не всегда работает — лучше повторить выражение)

sql
-- Работает не во всех версиях Oracle:
HAVING total_salary > 10000

5️⃣ Группировка по дате и фильтрация по количеству заказов

sql
SELECT TO_CHAR(order_date, 'YYYY-MM') AS month, COUNT(*) AS orders_count
FROM orders
GROUP BY TO_CHAR(order_date, 'YYYY-MM')
HAVING COUNT(*) >= 100;

6️⃣ ХЭВИНГ в подзапросе

sql
SELECT *
FROM (
SELECT department_id, COUNT(*) AS cnt
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 5
) t;

7️⃣ HAVING без GROUP BY — на всю таблицу

sql
SELECT COUNT(*) AS cnt
FROM employees
HAVING COUNT(*) > 0;

8️⃣ Сравнение с WHERE (до группировки)

sql
-- Только WHERE
SELECT department_id, COUNT(*)
FROM employees
WHERE hire_date > TO_DATE('01.01.2020', 'DD.MM.YYYY')
GROUP BY department_id;
— Только HAVING
SELECT department_id, COUNT(*)
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 5;

9️⃣ Фильтрация по агрегату MAX()

sql
SELECT manager_id, MAX(salary) AS max_sal
FROM employees
GROUP BY manager_id
HAVING MAX(salary) > 10000;

🔟 ХЭВИНГ с выражением CASE

sql
SELECT
CASE WHEN department_id = 50 THEN 'Склад'
ELSE 'Другие отделы' END AS dept_type,
COUNT(*) AS emp_count
FROM employees
GROUP BY CASE WHEN department_id = 50 THEN 'Склад'
ELSE 'Другие отделы' END
HAVING COUNT(*) > 5;

🧩 Заключение

HAVING — это мощный фильтр на уровне групп, который позволяет гибко контролировать результат после агрегации. Он дополняет GROUP BY, делая SQL-запросы аналитически сильными.

💡 Запомни:

  • HAVING работает после GROUP BY

  • Используется с агрегатными функциями

  • Не путай с WHERE (он фильтрует строки, а HAVING — группы)

  • Можно комбинировать с подзапросами, CASE, логическими выражениями


🔜 Следующая статья:

GROUP в Oracle SQL — как управлять агрегацией и группировкой данных


 

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии