В блог
Агрегатные функции в SQL запросах: что это и для чего нужны - IT Resume

Агрегатные функции в SQL запросах: что это и для чего нужны

Дата последнего обновления: 02.05.2025
Дата размещения: 02.05.2025
Евгений Буторин

Введение

В мире данных часто требуется не просто извлечь информацию, но и обобщить ее: посчитать общее количество записей, вычислить среднее значение или сумму этих значений, найти максимум или минимум. Именно для этого в SQL существуют агрегатные функции — специальные функции, которые обрабатывают набор значений и возвращают единственный результат для указанной группы полей.

В этой статье мы разберем, что такое агрегатные функции, как они работают и где применяются. Рассмотрим основные функции: COUNT, SUM, AVG, MAX, MIN, а также их комбинации. Узнаем, как группировать данные с помощью GROUP BY и фильтровать агрегированные результаты с помощью HAVING в рамках единого запроса. В конце приведем практические примеры для закрепления материала.

Что такое агрегатная функция в SQL

Агрегатная функция — это операция, которая принимает множество значений (например, все числа в столбце) и возвращает одно вычисленное значение.

Основные особенности:

  1. Работают с наборами данных (столбцами или выражениями).
  2. Игнорируют NULL (кроме COUNT()).
  3. Используются вместе с GROUP BY для групповой обработки.
    Без агрегатных функций пришлось бы выгружать все строки и считать вручную, что неэффективно.

Для чего используются агрегатные функции

Основные задачи агрегатных функций:

  • Анализ данных (например, расчет средних продаж или общей выручки).
  • Фильтрация (выбор групп, где сумма больше заданного значения).
  • Оптимизация (агрегация на стороне БД, а не в отчете).

Пример: вместо выгрузки всех заказов можно сразу получить их общее количество и сумму по группам товаров и месяцам.

Функция COUNT

Считает количество строк или не-NULL значений. Чаще всего применяется для калькуляции числа клиентов, остатков, строк (при валидации таблиц).

Синтаксис:

SELECT поле (одно или несколько), COUNT(по полю) FROM table
GROUP BY поле (одно или несколько)

Если нужно просто посчитать количество строк в таблице, то синтаксис будет выглядеть упрощенным:

SELECT COUNT(*) FROM table

Примеры:

  1. Количество заказов по месяцам:
SELECT month, COUNT(order_id) FROM orders
GROUP BY month
  1. Количество уникальных пользователей, купивших продукт в 2024 году:
    Важно: COUNT() считает все строки, включая NULL, а COUNT(column) — только не-NULL значения.

Также внутри COUNT можно использовать DISTINCT, которые уникализирует данные.

SELECT month, product, COUNT(distinct client_uk) FROM clients
WHERE month >=2024-01-01GROUP BY month, product

Функция SUM

Суммирует значения в столбце. Обычно используется для суммирования продаж, размеров транзакций,
Синтаксис:

SELECT SUM(по полю) FROM table

Пример:
Общая выручка за 2024 год:

SELECT SUM(revenue) as total_revenue FROM sales
WHERE 1 = 1
	AND DATE >=2024-01-01AND DATE <2025-01-01

Особенности:

  • Игнорирует NULL.
  • Работает только с числами.

Функция AVG

Вычисляет среднее арифметическое значение.
Синтаксис:

SELECT AVG(по полю) FROM table

Пример:
Средний чек в магазине за 2024 год:

SELECT AVG(RUR_AMT) as avg_bill FROM transactions
WHERE 1 = 1
	AND DATE >=2024-01-01AND DATE <2025-01-01

Нюансы:

  • NULL не учитывается.
  • Для точности можно использовать CAST:
SELECT CAST(AVG(RUR_AMT) as FLOAT) as avg_bill FROM transactions
WHERE 1 = 1
	AND DATE >=2024-01-01AND DATE <2025-01-01

Функции MAX и MIN

Находят максимальное и минимальное значение в столбце. Основываясь на своем опыте, чаще всего применяются для поиска максимальной и минимальной даты, но можно использовать и для других целей, например для выявления границ выборки.

Синтаксис:

SELECT MIN(по полю), MAX(по полю) from table

Пример:
Самый дорогой и дешевый товар:

SELECT MAX(price) as max_price, MIN(price) as min_price from items

Применение:

  • Анализ диапазонов (цена, даты, возраст).
  • Поиск экстремальных значений.

Комбинирование функций

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

Пример:
Статистика по заказам:

	SELECT
		Period,
		COUNT(DISTINCT client_uk) as cl_dis,
		SUM(sale_flag) as sales,
		AVG(RUR_AMT) as avg_bill
	FROM orders
	WHERE period >=2025-01-01GROUP BY period

Использование GROUP BY

GROUP BY группирует данные перед применением агрегатных функций. То есть, простыми словами, GROUP BY позволяет вам агрегировать данные по определенному значению поля. Например, у вас есть три вида фруктов (бананы, яблоки и груши), которые хранятся на 10 складах. Вам нужно посчитать общие остатки каждого фрукта на складах. Для этого мы убираем поле с наименование склада и группируем данные по полю, где указано наименование фруктов:

	SELECT fruit, sum(fruit_cnt) as cnt FROM remains
	GROUP BY fruit

Пример:
Выручка по странам:

SELECT country_name, SUM(revenue) as revenue FROM county_sales
GROUP BY country_name

Важно:

  • В SELECT можно включать только агрегатные функции или столбцы из GROUP BY.
  • Порядок группировки: GROUP BY → агрегация.

Использование HAVING

HAVING фильтрует результаты после агрегации (в отличие от WHERE).

Пример:
Страны с выручкой больше 1 млн:

SELECT country_name, SUM(revenue) as revenue FROM county_sales
Where date >=2024-01-01GROUP BY country_name
HAVING SUM(revenue) > 1000000

Отличие от WHERE:

  • WHERE фильтрует до агрегации.
  • HAVING — после.

Агрегатные оконные функции

Оконные функции (OVER) позволяют применять агрегацию без свертки строк.

Пример:
Сумма продаж по продуктам с накоплением:

SELECT 
	date,
	product,
	SUM(sales) OVER(PARTITION BY product ORDER BY date) as running_total
FROM sales

Ключевые возможности:

  • PARTITION BY — аналог GROUP BY внутри окна.
  • ORDER BY — порядок вычислений.

Примеры

  1. Количество пользователей по городам:
SELECT city, count(clinet_uk) as cnt FROM users
GROUP BY city
  1. Средний возраст клиентов по статусу:
SELECT status, AVG(age) as avg_age FROM customers
GROUP BY status
  1. Топ-5 товаров по продажам:
SELECT 
	product,
	SUM(sales) as sales
FROM sales
WHERE date >=2025-01-01GROUP BY product
ORDER BY sales DESC
LIMIT 5;

Заключение

Агрегатные функции — мощный инструмент для анализа данных в SQL.

Они позволяют:

  • Считать количество, сумму, среднее, максимум и минимум.
  • Группировать данные с GROUP BY.
  • Фильтровать агрегированные результаты через HAVING.
  • Использовать оконные функции для сложных расчетов.

Советы по оптимизации:

  1. Фильтруйте данные WHERE до агрегации.
  2. Используйте индексы для столбцов в GROUP BY.
  3. Для больших таблиц применяйте приблизительные агрегаты (например, APPROX_COUNT_DISTINCT).

Освоив агрегатные функции, вы сможете легко строить отчеты, анализировать метрики и оптимизировать запросы.

Подпишитесь на нашу рассылку
Имя*
Email*
Номер телефона*
Заполняя данную форму, Вы соглашаетесь с политикой конфиденциальности
Никакого спама. Только точечные рассылки с лучшими материалами.