12.19.1 Описание агрегатных функций
В этом разделе описываются агрегатные функции, работающие со множествами значений. Они часто используются с клаузой GROUP
BY для группировки значений в подмножества.
Таблица 12.25 Агрегатные функции
| Имя | Описание | Введено |
|---|---|---|
AVG() | Возвращает среднее значение аргумента | |
BIT_AND() | Возвращает побитовую конъюнкцию | |
BIT_OR() | Возвращает побитовую дизъюнкцию | |
BIT_XOR() | Возвращает побитовое исключающее ИЛИ | |
COUNT() | Возвращает количество строк | |
COUNT(DISTINCT) | Возвращает количество различных значений | |
GROUP_CONCAT() | Возвращает конкатенированную строку | |
JSON_ARRAYAGG() | Возвращает результат в виде одного JSON-массива | 5.7.22 |
JSON_OBJECTAGG() | Возвращает результат в виде одного JSON-объекта | 5.7.22 |
MAX() | Возвращает максимальное значение | |
MIN() | Возвращает минимальное значение | |
STD() | Возвращает стандартное отклонение генеральной совокупности | |
STDDEV() | Возвращает стандартное отклонение генеральной совокупности | |
STDDEV_POP() | Возвращает стандартное отклонение генеральной совокупности | |
STDDEV_SAMP() | Возвращает стандартное отклонение выборки | |
SUM() | Возвращает сумму | |
VAR_POP() | Возвращает дисперсию генеральной совокупности | |
VAR_SAMP() | Возвращает дисперсию выборки | |
VARIANCE() | Возвращает дисперсию генеральной совокупности |
Если не указано иное, агрегатные функции игнорируют NULL значения.
Если вы используете агрегатную функцию в операторе без клаузы GROUP BY, она эквивалентна группировке по всем строкам. Дополнительную информацию см. в разделе 12.19.3, «Обработка GROUP BY в MySQL».
Для числовых аргументов функции дисперсии и стандартного отклонения возвращают значение типа DOUBLE. Функции SUM() и AVG() возвращают значение типа DECIMAL для аргументов точного значения (целого числа или DECIMAL), и значение типа DOUBLE для аргументов приближенного значения (FLOAT или DOUBLE).
Агрегатные функции SUM() и AVG() не работают со временными значениями. (Они преобразуют значения в числа, теряя всё после первой нечисловой буквы.) Чтобы обойти эту проблему, преобразуйте в числовые единицы, выполните агрегатную операцию и преобразуйте обратно во временное значение. Примеры:
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col))) FROM tbl_name;
SELECT FROM_DAYS(SUM(TO_DAYS(date_col))) FROM tbl_name;
Такие функции, как SUM() или AVG(), ожидающие числовой аргумент, преобразуют аргумент в число при необходимости. Для значений типа SET или ENUM, операция преобразования использует лежащее в основе числовое значение.
Агрегатные функции BIT_AND(), BIT_OR() и BIT_XOR() выполняют побитовые операции. Они требуют аргументов типа BIGINT (64-битное целое число) и возвращают значения типа BIGINT. Аргументы других типов преобразуются в BIGINT, и может произойти усечение. Информация о изменении в MySQL 8.0, позволяющем побитовым операциям принимать аргументы типа бинарной строки (BINARY, VARBINARY и типов BLOB) см. разделе 12.12, «Битовые функции и операторы».
-
Возвращает среднее значение
. ОпцияexprDISTINCTможет быть использована для возвращения среднего значения различных значенийexpr.Если нет соответствующих строк,
AVG()возвращаетNULL.mysql>
SELECT student_name, AVG(test_score)FROM studentGROUP BY student_name; -
Возвращает побитовое
ANDвсех битов вexpr. Вычисление выполняется с 64-битной (BIGINT) точностью.Если нет соответствующих строк,
BIT_AND()возвращает нейтральное значение (все биты установлены в 1). -
Возвращает побитовое
ORвсех битов вexpr. Вычисление выполняется с 64-битной (BIGINT) точностью.Если нет соответствующих строк,
BIT_OR()возвращает нейтральное значение (все биты установлены в 0). -
Возвращает побитовое
XORвсех битов вexpr. Вычисление выполняется с 64-битной (BIGINT) точностью.Если нет соответствующих строк,
BIT_XOR()возвращает нейтральное значение (все биты установлены в 0). -
Возвращает количество значений
expr, не являющихсяNULL, в строках, полученных операторомSELECT. Результат является значениемBIGINT.Если нет соответствующих строк,
COUNT()возвращает0.mysql>
SELECT student.student_name,COUNT(*)FROM student,courseWHERE student.student_id=course.student_idGROUP BY student_name;COUNT(*)несколько отличается тем, что возвращает количество полученных строк, содержат ли они значенияNULLили нет.Для транзакционных хранилищ, таких как
InnoDB, хранение точного количества строк представляет собой проблему. Одновременно может выполняться несколько транзакций, каждая из которых может повлиять на счёт.InnoDBне сохраняет внутренний счёт строк в таблице, так как параллельные транзакции могут “видеть” разное количество строк одновременно. Вследствие этого, операторыSELECT COUNT(*)подсчитывают только строки, видимые текущей транзакцией.До MySQL 5.7.18,
InnoDBобрабатывает операторыSELECT COUNT(*), сканируя кластеризованный индекс. Начиная с MySQL 5.7.18,InnoDBобрабатывает операторыSELECT COUNT(*), проходя по наименьшему доступному вторичному индексу, если индекс или подсказка оптимизатору не указывают использовать другой индекс. Если вторичный индекс отсутствует, сканируется кластеризованный индекс.Обработка операторов
SELECT COUNT(*)занимает некоторое время, если записи индекса не полностью находятся в кэше. Для более быстрого подсчёта создайте таблицу счётчика и позвольте вашему приложению обновлять её в соответствии с вставками и удалениями, которые оно выполняет. Однако этот метод может не масштабироваться в ситуациях, когда тысячи параллельных транзакций производят обновления одной и той же таблицы счётчика. Если достаточно приблизительного количества строк, используйтеSHOW TABLE STATUS.InnoDBобрабатывает операцииSELECT COUNT(*)иSELECT COUNT(1)одинаково. Разницы в производительности нет.Для
MyISAMтаблиц,COUNT(*)оптимизирован для очень быстрого возвращения, если операторSELECTизвлекает данные из одной таблицы, другие столбцы не извлекаются и нет условияWHERE. Например:mysql>
SELECT COUNT(*) FROM student;Эта оптимизация применяется только к
MyISAMтаблицам, так как для этого движка хранилища сохраняется точное количество строк, к которому можно очень быстро получить доступ.COUNT(1)подчиняется той же оптимизации, только если первый столбец определен какNOT NULL. -
COUNT(DISTINCTexpr,[expr...])Возвращает количество строк с различными значениями
expr, не являющимисяNULL.Если нет соответствующих строк,
COUNT(DISTINCT)возвращает0.mysql>
SELECT COUNT(DISTINCT results) FROM student;В MySQL можно получить количество различных комбинаций выражений, не содержащих
NULL, указав список выражений. В стандартном SQL пришлось бы использовать конкатенацию всех выражений внутриCOUNT(DISTINCT ...). -
Эта функция возвращает строковый результат с конкатенированными значениями, не являющимися
NULL, из группы. ВозвращаетNULL, если нет значений, не являющихсяNULL. Полный синтаксис следующий:GROUP_CONCAT([DISTINCT]
expr[,expr...] [ORDER BY {unsigned_integer|col_name|expr} [ASC | DESC] [,col_name...]] [SEPARATORstr_val])mysql>
SELECT student_name,GROUP_CONCAT(test_score)FROM studentGROUP BY student_name;Или:
mysql>
SELECT student_name,GROUP_CONCAT(DISTINCT test_scoreORDER BY test_score DESC SEPARATOR ' ')FROM studentGROUP BY student_name;В MySQL вы можете получить конкатенированные значения комбинаций выражений. Для устранения дубликатов значений используйте предложение
DISTINCT. Для сортировки значений в результате используйте предложениеORDER BY. Для сортировки в обратном порядке добавьте ключевое словоDESC(убывание) к имени столбца, по которому вы сортируете в предложенииORDER BY. По умолчанию используется возрастающий порядок; это может быть указано явно с помощью ключевого словаASC. По умолчанию разделителем между значениями в группе является запятая (,). Для явного указания разделителя используйтеSEPARATOR, за которым следует строковая константа, которая должна быть вставлена между значениями группы. Для удаления разделителя полностью укажитеSEPARATOR ''.Результат усекается до максимальной длины, задаваемой переменной сервера
group_concat_max_len, которая имеет значение по умолчанию 1024. Значение может быть установлено выше, хотя эффективная максимальная длина возвращаемого значения ограничена значениемmax_allowed_packet. Синтаксис изменения значенияgroup_concat_max_lenво время выполнения следующий, гдеval— целое без знака:SET [GLOBAL | SESSION] group_concat_max_len =
val;Возвращаемое значение является небинарной или бинарной строкой в зависимости от того, являются ли аргументы небинарными или бинарными строками. Тип результата —
TEXTилиBLOB, еслиgroup_concat_max_lenменьше или равно 512, в противном случае —VARCHARилиVARBINARY.Если
GROUP_CONCAT()вызывается из клиента mysql, результаты бинарных строк отображаются в шестнадцатеричном формате в зависимости от значения--binary-as-hex. Дополнительную информацию об этом параметре см. в разделе 4.5.1, «mysql — Клиент командной строки MySQL».См. также
CONCAT()иCONCAT_WS(): раздел 12.8, «Функции и операторы работы со строками». -
Агрегирует результат в одном массиве
JSON, элементы которого состоят из строк. Порядок элементов в этом массиве не определён. Функция работает со столбцом или выражением, которое оценивается как одиночное значение. ВозвращаетNULL, если результат не содержит строк или при ошибке.mysql>
SELECT o_id, attribute, value FROM t3;+------+-----------+-------+ | o_id | attribute | value | +------+-----------+-------+ | 2 | color | red | | 2 | fabric | silk | | 3 | color | green | | 3 | shape | square| +------+-----------+-------+ 4 rows in set (0.00 sec) mysql>SELECT o_id, JSON_ARRAYAGG(attribute) AS attributes->FROM t3 GROUP BY o_id;+------+---------------------+ | o_id | attributes | +------+---------------------+ | 2 | ["color", "fabric"] | | 3 | ["color", "shape"] | +------+---------------------+ 2 rows in set (0.00 sec)Добавлен в MySQL 5.7.22.
-
Принимает два имени столбцов или выражения в качестве аргументов, первое из которых используется в качестве ключа, а второе — в качестве значения, и возвращает объект JSON, содержащий пары ключ-значение. Возвращает
NULL, если результат не содержит строк или в случае ошибки. Ошибка возникает, если любое имя ключа являетсяNULLили количество аргументов не равно 2.mysql>
SELECT o_id, attribute, value FROM t3;+------+-----------+-------+ | o_id | attribute | value | +------+-----------+-------+ | 2 | color | red | | 2 | fabric | silk | | 3 | color | green | | 3 | shape | square| +------+-----------+-------+ 4 rows in set (0.00 sec) mysql>SELECT o_id, JSON_OBJECTAGG(attribute, value)->FROM t3 GROUP BY o_id;+------+---------------------------------------+ | o_id | JSON_OBJECTAGG(attribute, value) | +------+---------------------------------------+ | 2 | {"color": "red", "fabric": "silk"} | | 3 | {"color": "green", "shape": "square"} | +------+---------------------------------------+ 2 rows in set (0.00 sec)Обработка дубликатов ключей. При нормализации результата этой функции значения с дублирующимися ключами отбрасываются. В соответствии со спецификацией типа данных MySQL
JSON, которая не допускает дубликатов ключей, используется только последнее встреченное значение с этим ключом в возвращаемом объекте (“last duplicate key wins”). Это означает, что результат использования этой функции для столбцов изSELECTможет зависеть от порядка, в котором возвращаются строки, что не гарантируется.Рассмотрим следующее:
mysql>
CREATE TABLE t(c VARCHAR(10), i INT);Query OK, 0 rows affected (0.33 sec) mysql>INSERT INTO t VALUES ('key', 3), ('key', 4), ('key', 5);Query OK, 3 rows affected (0.10 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql>SELECT c, i FROM t;+------+------+ | c | i | +------+------+ | key | 3 | | key | 4 | | key | 5 | +------+------+ 3 rows in set (0.00 sec) mysql>SELECT JSON_OBJECTAGG(c, i) FROM t;+----------------------+ | JSON_OBJECTAGG(c, i) | +----------------------+ | {"key": 5} | +----------------------+ 1 row in set (0.00 sec) mysql>DELETE FROM t;Query OK, 3 rows affected (0.08 sec) mysql>INSERT INTO t VALUES ('key', 3), ('key', 5), ('key', 4);Query OK, 3 rows affected (0.06 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql>SELECT c, i FROM t;+------+------+ | c | i | +------+------+ | key | 3 | | key | 5 | | key | 4 | +------+------+ 3 rows in set (0.00 sec) mysql>SELECT JSON_OBJECTAGG(c, i) FROM t;+----------------------+ | JSON_OBJECTAGG(c, i) | +----------------------+ | {"key": 4} | +----------------------+ 1 row in set (0.00 sec)См. Нормализация, объединение и автоматическое оборачивание значений JSON для получения дополнительной информации и примеров.
Добавлено в MySQL 5.7.22.
-
Возвращает максимальное значение
expr.MAX()может принимать строковый аргумент; в таких случаях он возвращает максимальное строковое значение. См. Раздел 8.3.1, «Как MySQL использует индексы». Ключевое словоDISTINCTможет использоваться для поиска максимума среди различных значенийexpr, однако это дает тот же результат, что и пропускDISTINCT.Если нет совпадающих строк,
MAX()возвращаетNULL.mysql>
SELECT student_name, MIN(test_score), MAX(test_score)FROM studentGROUP BY student_name;Для
MAX(), MySQL в настоящее время сравнивает столбцыENUMиSETпо их строковому значению, а не по относительному положению строки в наборе. Это отличается от того, какORDER BYсравнивает их. -
Возвращает минимальное значение
expr.MIN()может принимать строковый аргумент; в таких случаях он возвращает минимальное строковое значение. См. Раздел 8.3.1, «Как MySQL использует индексы». Ключевое словоDISTINCTможет использоваться для поиска минимума среди различных значенийexpr, однако это дает тот же результат, что и пропускDISTINCT.Если нет совпадающих строк,
MIN()возвращаетNULL.mysql>
SELECT student_name, MIN(test_score), MAX(test_score)FROM studentGROUP BY student_name;Для
MIN(), MySQL в настоящее время сравнивает столбцыENUMиSETпо их строковому значению, а не по относительному положению строки в наборе. Это отличается от того, какORDER BYсравнивает их. -
Возвращает генеральное стандартное отклонение
expr.STD()является синонимом стандартной функции SQLSTDDEV_POP(), предоставленной как расширение MySQL.Если нет совпадающих строк,
STD()возвращаетNULL. -
Возвращает генеральное стандартное отклонение
expr.STDDEV()является синонимом стандартной функции SQLSTDDEV_POP(), предоставленной для совместимости с Oracle.Если нет совпадающих строк,
STDDEV()возвращаетNULL. -
Возвращает генеральное стандартное отклонение
expr(квадратный корень изVAR_POP()). Вы также можете использоватьSTD()илиSTDDEV(), которые эквивалентны, но не являются стандартным SQL.Если нет совпадающих строк,
STDDEV_POP()возвращаетNULL. -
Возвращает выборочное стандартное отклонение
expr(квадратный корень изVAR_SAMP().Если нет совпадающих строк,
STDDEV_SAMP()возвращаетNULL. -
Возвращает сумму
expr. Если возвращаемый набор не содержит строк,SUM()возвращаетNULL. Ключевое словоDISTINCTможет использоваться для суммирования только различных значенийexpr.Если нет совпадающих строк,
SUM()возвращаетNULL. -
Возвращает генеральную дисперсию
expr. Она рассматривает строки как всю генеральную совокупность, а не как выборку, поэтому в знаменателе используется количество строк. Вы также можете использоватьVARIANCE(), которая эквивалентна, но не является стандартным SQL.Если нет совпадающих строк,
VAR_POP()возвращаетNULL. -
Возвращает выборочную дисперсию
expr. То есть знаменатель равен количеству строк минус один.Если нет совпадающих строк,
VAR_SAMP()возвращаетNULL. -
Возвращает генеральную дисперсию
expr.VARIANCE()является синонимом стандартной функции SQLVAR_POP(), предоставленной как расширение MySQL.Если нет совпадающих строк,
VARIANCE()возвращаетNULL.
© 2025 Oracle
Licensed under the GPLv2 License.