Агрегатные функции
Агрегатные функции — это функции в системах управления базами данных (СУБД) и языках программирования, которые выполняют вычисления над набором значений (группой строк) и возвращают одно итоговое значение. Они являются фундаментальным инструментом для анализа данных, позволяя получать обобщённую информацию из таблиц, такую как суммы, средние значения, количества, минимумы и максимумы. В отличие от скалярных функций, которые обрабатывают каждую строку отдельно, агрегатные функции работают с группами строк, объединённых по определённому критерию.
Основные характеристики
Агрегатные функции обычно применяются в запросах к базам данных, чаще всего в сочетании с оператором SELECT и конструкцией GROUP BY. Ключевой особенностью является то, что они игнорируют значения NULL при вычислениях, за исключением функции COUNT(*), которая подсчитывает все строки, включая те, которые содержат NULL. Результат агрегатной функции — это всегда одно значение для каждой группы или для всего набора данных.
Агрегатные функции могут быть встроенными (предопределёнными в СУБД) или пользовательскими (созданными разработчиком). Стандарт SQL (ISO/IEC 9075) определяет набор базовых агрегатных функций, которые поддерживаются большинством реляционных СУБД.
Классификация
Стандартные агрегатные функции SQL
К наиболее распространённым встроенным агрегатным функциям относятся:
COUNT()— возвращает количество строк в группе.COUNT(*)подсчитывает все строки, включая дубликаты и NULL;COUNT(column)подсчитывает только строки, где значение в указанном столбце не равно NULL;COUNT(DISTINCT column)подсчитывает количество уникальных не-NULL значений.SUM()— возвращает сумму всех значений в группе. Применяется только к числовым типам данных.AVG()— возвращает среднее арифметическое значение в группе. Также работает только с числами. Игнорирует NULL.MIN()— возвращает минимальное значение в группе. Может применяться к числам, строкам и датам.MAX()— возвращает максимальное значение в группе. АналогичноMIN().
Специализированные и расширенные функции
Многие СУБД (например, PostgreSQL, Oracle, Microsoft SQL Server, MySQL) добавляют собственные агрегатные функции, расширяющие стандартные возможности:
- Статистические функции:
STDDEV()(среднеквадратическое отклонение),VARIANCE()(дисперсия),CORR()(корреляция),REGR_*()(функции регрессионного анализа). - Функции для работы со строками:
STRING_AGG()(в PostgreSQL, SQL Server) илиGROUP_CONCAT()(в MySQL) — объединяют строковые значения из группы в одну строку с разделителем. - Функции для работы с массивами:
ARRAY_AGG()(в PostgreSQL) — собирает значения в массив. - Функции для ранжирования и оконных вычислений: хотя они часто выделяются в отдельную категорию оконных функций, некоторые из них (например,
ROW_NUMBER(),RANK(),DENSE_RANK()) могут использоваться в агрегирующем контексте, но их основное назначение — присвоение номеров строкам в группе, а не вычисление одного значения. - Пользовательские агрегатные функции (UDA): создаются разработчиками для решения специфических задач, например, для вычисления моды, медианы или сложных финансовых показателей.
Применение в SQL
Агрегатные функции используются в запросах SELECT для получения сводной информации. Основные правила их применения:
- Без
GROUP BY: Если агрегатная функция используется безGROUP BY, она обрабатывает все строки таблицы, возвращая одно итоговое значение.
``sql SELECT AVG(price) AS average_price FROM products; ``
- С
GROUP BY: Функция применяется к каждой группе, образованной значениями столбца, указанного вGROUP BY.
``sql SELECT category, COUNT(*) AS product_count, AVG(price) AS avg_price FROM products GROUP BY category; ``
- С
HAVING: УсловиеHAVINGиспользуется для фильтрации групп после применения агрегатных функций (аналогWHEREдля групп).
``sql SELECT category, AVG(price) AS avg_price FROM products GROUP BY category HAVING AVG(price) > 100; ``
- С
DISTINCT: Многие агрегатные функции поддерживают ключевое словоDISTINCTвнутри себя для учёта только уникальных значений.
``sql SELECT COUNT(DISTINCT city) AS unique_cities FROM customers; ``
- В подзапросах: Агрегатные функции могут использоваться в подзапросах для вычисления значений, которые затем сравниваются с данными из внешнего запроса.
``sql SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products); ``
Примеры использования
Рассмотрим таблицу employees со столбцами id, name, department, salary.
- Подсчёт сотрудников в каждом отделе:
``sql SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department; ``
- Средняя зарплата по компании:
``sql SELECT AVG(salary) AS average_salary FROM employees; ``
- Максимальная и минимальная зарплата в отделе 'IT':
``sql SELECT MAX(salary) AS max_salary, MIN(salary) AS min_salary FROM employees WHERE department = 'IT'; ``
- Сумма зарплат в отделах, где работает более 3 сотрудников:
``sql SELECT department, SUM(salary) AS total_salary FROM employees GROUP BY department HAVING COUNT(*) > 3; ``
Ограничения и особенности
- Нельзя смешивать: В одном запросе
SELECTбезGROUP BYнельзя смешивать агрегатные функции и обычные столбцы, если только эти столбцы не являются частьюGROUP BY. Например, запросSELECT name, AVG(salary) FROM employees;вызовет ошибку в большинстве СУБД, так какnameне агрегирован и не указан вGROUP BY. - Производительность: Агрегатные функции, особенно на больших таблицах, могут быть ресурсоёмкими. Для ускорения работы рекомендуется использовать индексы на столбцах, участвующих в
GROUP BYиWHERE. - Обработка NULL: Как упоминалось, большинство агрегатных функций игнорируют NULL. Это важно учитывать при интерпретации результатов, особенно для
AVG()иCOUNT(column). - Сортировка: Результат запроса с
GROUP BYне гарантирует определённого порядка строк. Для сортировки используетсяORDER BY, который может применяться как к агрегатным функциям, так и к столбцам группировки.
Агрегатные функции в других языках
Понятие агрегатных функций не ограничивается SQL. Они широко используются в:
- Языках программирования: В Python (библиотека pandas:
groupby().agg()), R (пакет dplyr:summarise()), Java (Stream API:collect(Collectors.summingInt())), C# (LINQ:Sum(),Average()). - Электронных таблицах: В Microsoft Excel и Google Sheets функции
SUM,AVERAGE,COUNT,MAX,MINявляются аналогами SQL-агрегатов. - Системах аналитики: Apache Spark, Hadoop, ClickHouse и другие инструменты big data предоставляют собственные реализации агрегатных функций для распределённой обработки данных.
История
Концепция агрегатных функций была формализована в ранних версиях SQL (SQL-86, SQL-89) и стала неотъемлемой частью реляционной модели данных. Развитие стандарта SQL (SQL:1999, SQL:2003, SQL:2016) привело к появлению более сложных функций, таких как оконные и аналитические, которые расширили возможности агрегации. В России и мире агрегатные функции стали стандартом де-факто для любой работы с реляционными базами данных, начиная от простых отчётов и заканчивая сложными системами бизнес-аналитики.
Источники
- Международный стандарт SQL:2016 (ISO/IEC 9075:2016).
- Документация PostgreSQL 16 (раздел "Aggregate Functions").
- Документация MySQL 8.0 (раздел "Aggregate Functions").
- Документация Microsoft SQL Server (раздел "Aggregate Functions (Transact-SQL)").
- Книга: "SQL: The Complete Reference" by James R. Groff, Paul N. Weinberg, Andrew J. Oppel.
- Книга: "Learning SQL" by Alan Beaulieu.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →