Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад

Как фильтровать агрегированные данные в SQL?

Вопрос проверяет понимание различий между фильтрацией строк и агрегированных групп в SQL, что важно для корректного формирования аналитических отчётов.

Короткий ответ

Для фильтрации агрегированных данных в SQL используется оператор HAVING. Он применяется после группировки GROUP BY и позволяет отфильтровать группы строк по результатам агрегатных функций (например, SUM, AVG, COUNT). В отличие от WHERE, который фильтрует отдельные строки до группировки, HAVING работает с уже сгруппированными результатами. Это ключевое различие, которое нужно понимать для написания сложных аналитических запросов.

Длинный ответ

В SQL для работы с агрегированными данными, такими как суммы, средние значения или количество записей в группах, используется комбинация операторов GROUP BY и агрегатных функций. Однако часто возникает необходимость отобрать не все группы, а только те, которые удовлетворяют определённому условию по результату агрегации. Именно для этой цели служит оператор HAVING.

Различие между WHERE и 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 часто используется в бизнес-аналитике и отчётности. Например:

  • Найти категории товаров, общая выручка по которым превысила определённый порог.
  • Выбрать клиентов, сделавших более 10 заказов за последний год.
  • Определить отделы, где средняя зарплата сотрудников значительно отклоняется от общей средней по компании.

Пример запроса для поиска активных клиентов:

SELECT customer_id, COUNT(order_id) as order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) >= 5;

Вывод: Оператор HAVING — это необходимый инструмент для фильтрации данных на уровне групп в аналитических SQL-запросах. Его следует применять, когда условие отбора зависит от результата агрегатной функции (суммы, среднего, количества), а не от значений отдельных строк.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • SQL

Ключевые слова

#SQL

#HAVING

#GROUP BY

#aggregate functions

#filter

Подпишись на Java Developer в телеграм