本节描述操作值集的聚合函数。它们经常和a连用集团
子句将值分组为子集。
表12.25聚合函数
的名字 | 描述 |
---|---|
AVG () |
返回参数的平均值 |
BIT_AND () |
按位返回AND |
BIT_OR () |
按位返回OR |
BIT_XOR () |
按位返回XOR |
COUNT () |
返回返回行数的计数 |
数(不同的) |
返回多个不同值的计数 |
GROUP_CONCAT () |
返回一个连接的字符串 |
JSON_ARRAYAGG () |
将结果集作为单个JSON数组返回 |
JSON_OBJECTAGG () |
将结果集作为单个JSON对象返回 |
MAX () |
返回最大值 |
MIN () |
返回最小值 |
性病() |
返回总体标准差 |
STDDEV () |
返回总体标准差 |
STDDEV_POP () |
返回总体标准差 |
STDDEV_SAMP () |
返回样本标准差 |
SUM () |
返回和 |
VAR_POP () |
返回总体标准方差 |
VAR_SAMP () |
返回样本方差 |
方差() |
返回总体标准方差 |
除非另有说明,聚合函数将忽略零
值。
如果在包含no的语句中使用聚合函数集团
子句,它相当于对所有行进行分组。有关更多信息,请参见第12.20.3节,“MySQL处理GROUP BY”.
大多数聚合函数都可以用作窗口函数。可以以这种方式使用的那些在其语法描述中由表示[
,表示可选的over_clause
]在
条款。over_clause
描述在第12.21.2节,“窗口函数概念和语法”,其中还包括有关窗口函数使用的其他信息。
对于数值参数,方差和标准偏差函数返回a双
价值。的SUM ()
而且AVG ()
函数返回小数
值为精确值参数(整数或小数
),以及双
值的近似值参数(浮动
或双
).
的SUM ()
而且AVG ()
聚合函数不适用于时态值。(它们将值转换为数字,丢失第一个非数字字符之后的所有内容。)要解决此问题,请转换为数值单位,执行聚合操作,然后转换回时间值。例子:
选择SEC_TO_TIME(总和(TIME_TO_SEC (time_col)))tbl_name;选择FROM_DAYS(总和(TO_DAYS (date_col)))tbl_name;
函数如SUM ()
或AVG ()
,在必要时将实参转换为数字。为集
或枚举
值时,强制转换操作将使用基础数值。
的BIT_AND ()
,BIT_OR ()
,BIT_XOR ()
聚合函数执行位操作。在MySQL 8.0之前,需要位函数和操作符长整型数字
(64位整数)参数并返回长整型数字
值,所以它们的最大范围是64位。非长整型数字
参数被转换为长整型数字
在执行操作之前,可能会发生截断。
在MySQL 8.0中,位函数和操作符允许二进制字符串类型参数(二进制
,VARBINARY
,以及团
类型)并返回类似类型的值,这使它们能够接受参数并产生大于64位的返回值。有关位操作的实参求值和结果类型的讨论,请参阅中的介绍性讨论第12.13节“位函数和操作符”.
的平均值
.的expr
截然不同的
选项可用于返回的不同值的平均值expr
.如果没有匹配的行,
AVG ()
返回零
.此函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”;它不能与截然不同的
.mysql> SELECT student_name, AVG(test_score) FROM student GROUP BY student_name;
按位返回
和
所有的比特expr
.结果类型取决于函数实参值是作为二进制字符串还是数字进行计算:
当实参值为二进制字符串类型,且实参不是十六进制字面值、位字面值或
零
文字。数值计算则不然,必要时将参数值转换为无符号64位整数。二进制字符串求值产生与实参值相同长度的二进制字符串。如果参数值的长度不相等,则为
ER_INVALID_BITWISE_OPERANDS_SIZE
发生错误。如果参数大小超过511字节,则会触发ER_INVALID_BITWISE_AGGREGATE_OPERANDS_SIZE
发生错误。数值计算产生一个无符号64位整数。
如果没有匹配的行,
BIT_AND ()
返回一个与参数值长度相同的中性值(所有位都设置为1)。零
值不会影响结果,除非所有值都影响结果零
.在这种情况下,结果是一个与参数值长度相同的中性值。有关参数求值和结果类型的详细信息讨论,请参阅中的介绍讨论第12.13节“位函数和操作符”.
如果
BIT_AND ()
从mysql客户机时,二进制字符串结果使用十六进制表示法显示,具体值取决于——binary-as-hex
.有关该选项的详细信息,请参见章节4.5.1,“mysql - mysql命令行客户端”.从MySQL 8.0.12开始,这个函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”.按位返回
或
所有的比特expr
.结果类型取决于函数实参值是作为二进制字符串还是数字进行计算:
当实参值为二进制字符串类型,且实参不是十六进制字面值、位字面值或
零
文字。数值计算则不然,必要时将参数值转换为无符号64位整数。二进制字符串求值产生与实参值相同长度的二进制字符串。如果参数值的长度不相等,则为
ER_INVALID_BITWISE_OPERANDS_SIZE
发生错误。如果参数大小超过511字节,则会触发ER_INVALID_BITWISE_AGGREGATE_OPERANDS_SIZE
发生错误。数值计算产生一个无符号64位整数。
如果没有匹配的行,
BIT_OR ()
返回一个中性值(所有位都设置为0),其长度与参数值相同。零
值不会影响结果,除非所有值都影响结果零
.在这种情况下,结果是一个与参数值长度相同的中性值。有关参数求值和结果类型的详细信息讨论,请参阅中的介绍讨论第12.13节“位函数和操作符”.
如果
BIT_OR ()
从mysql客户机时,二进制字符串结果使用十六进制表示法显示,具体值取决于——binary-as-hex
.有关该选项的详细信息,请参见章节4.5.1,“mysql - mysql命令行客户端”.从MySQL 8.0.12开始,这个函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”.按位返回
XOR
所有的比特expr
.结果类型取决于函数实参值是作为二进制字符串还是数字进行计算:
当实参值为二进制字符串类型,且实参不是十六进制字面值、位字面值或
零
文字。数值计算则不然,必要时将参数值转换为无符号64位整数。二进制字符串求值产生与实参值相同长度的二进制字符串。如果参数值的长度不相等,则为
ER_INVALID_BITWISE_OPERANDS_SIZE
发生错误。如果参数大小超过511字节,则会触发ER_INVALID_BITWISE_AGGREGATE_OPERANDS_SIZE
发生错误。数值计算产生一个无符号64位整数。
如果没有匹配的行,
BIT_XOR ()
返回一个中性值(所有位都设置为0),其长度与参数值相同。零
值不会影响结果,除非所有值都影响结果零
.在这种情况下,结果是一个与参数值长度相同的中性值。有关参数求值和结果类型的详细信息讨论,请参阅中的介绍讨论第12.13节“位函数和操作符”.
如果
BIT_XOR ()
从mysql客户机时,二进制字符串结果使用十六进制表示法显示,具体值取决于——binary-as-hex
.有关该选项的详细信息,请参见章节4.5.1,“mysql - mysql命令行客户端”.从MySQL 8.0.12开始,这个函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”.返回非的个数的计数
零
的值expr
在a检索的行中选择
声明。结果是长整型数字
价值。如果没有匹配的行,
COUNT ()
返回0
.此函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”.mysql> SELECT student.student_name,COUNT(*) FROM student.student_id=course WHERE student.student_id=course。GROUP BY student_name;
COUNT (*)
它返回检索到的行数的计数,无论它们是否包含零
值。对于事务性存储引擎,例如
InnoDB
,存储准确的行数是有问题的。多个事务可能同时发生,每一个事务都可能影响计数。InnoDB
不保持表中的行内部计数,因为并发事务可能”看到”同一时间不同数量的行。因此,SELECT COUNT (*)
语句只计算当前事务可见的行。从MySQL 8.0.13开始,
选择count (*) from
查询性能tbl_name
InnoDB
表是针对单线程工作负载优化的,如果没有额外的子句,例如在哪里
或集团
.InnoDB
流程SELECT COUNT (*)
语句,遍历最小的可用二级索引,除非索引或优化器提示指示优化器使用不同的索引。如果二级索引不存在,InnoDB
流程SELECT COUNT (*)
语句,扫描聚集索引。处理
SELECT COUNT (*)
如果索引记录不完全在缓冲池中,语句将花费一些时间。为了更快地进行计数,可以创建一个计数器表,并让应用程序根据它所做的插入和删除来更新它。但是,在数千个并发事务对同一个计数器表发起更新的情况下,这种方法可能无法很好地扩展。如果近似的行数足够,则使用显示表状态
.InnoDB
处理SELECT COUNT (*)
而且选择统计(1)
操作方法相同。没有性能差异。为
MyISAM
表,COUNT (*)
被优化为很快返回如果选择
从一个表检索,不检索其他列,并且没有在哪里
条款。例如:SELECT COUNT(*) FROM student;
此优化仅适用于
MyISAM
表,因为为这个存储引擎存储了精确的行数,并且可以非常快速地访问。数(1)
只有当第一列定义为非空
.返回具有不同非的行数的计数
零
expr
值。如果没有匹配的行,
数(不同的)
返回0
.mysql> SELECT COUNT(DISTINCT results) FROM student
在MySQL中,您可以获得不包含的不同表达式组合的数量
零
通过给出一个表达式列表。在标准SQL中,您必须对其中的所有表达式进行连接计数(不同的…)
.此函数返回一个带有连接非的字符串结果
零
组中的值。它返回零
如果没有非零
值。完整的语法如下:GROUP_CONCAT([的]expr(,expr...][命令{unsigned_integer|col_name|expr} [asc | desc] [,col_name...]][分隔符str_val])
mysql> SELECT test_score FROM student GROUP BY student_name;
或者:
mysql> SELECT test_score, GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ') FROM student GROUP
在MySQL中,您可以获得表达式组合的连接值。若要消除重复值,请使用
截然不同的
条款。要对结果中的值排序,请使用命令
条款。要按相反顺序排序,请添加DESC
属性中要排序的列的名称命令
条款。默认为升序;属性可以显式地指定ASC
关键字。组中值之间的默认分隔符是逗号(,
).若要显式指定分隔符,请使用分隔符
后面跟着应该插入组值之间的字符串字面值。若要完全消除分隔符,请指定分隔符”
.方法给出的最大长度截断结果
group_concat_max_len
系统变量,默认值为1024。的值可以设置得更高,但是返回值的有效最大长度受到的值的约束max_allowed_packet
.的值的语法group_concat_max_len
在运行时,如下所示瓦尔
为无符号整数:SET [GLOBAL | SESSION] group_concat_max_len =瓦尔;
返回值是一个非二进制或二进制字符串,这取决于参数是非二进制还是二进制字符串。结果类型为
文本
或团
除非group_concat_max_len
小于或等于512,在这种情况下,结果类型是VARCHAR
或VARBINARY
.如果
GROUP_CONCAT ()
从mysql客户机时,二进制字符串结果使用十六进制表示法显示,具体值取决于——binary-as-hex
.有关该选项的详细信息,请参见章节4.5.1,“mysql - mysql命令行客户端”.JSON_ARRAYAGG (
col_or_expr
) [over_clause
]将结果集聚合为单个结果集
JSON
数组,其元素由行组成。此数组中元素的顺序未定义。该函数作用于求值为单个值的列或表达式。返回零
如果结果不包含行,或者发生错误。从MySQL 8.0.14开始,这个函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”.mysql> SELECT o_id, attribute, value FROM t3;+------+-----------+-------+ | o_id | |属性值 | +------+-----------+-------+ | 2 | |红色| | 2 | |丝绸| | 3 |色绿色| | | 3 | |广场形状 | +------+-----------+-------+ 4行集(0.00秒)mysql >选择o_id JSON_ARRAYAGG(属性)属性> o_id t3组;+------+---------------------+ | o_id |属性 | +------+---------------------+ | 2 |(“颜色”,“结构”)| | 3 |(“颜色”、“形状 "] | +------+---------------------+ 2行集(0.00秒)
JSON_OBJECTAGG (
关键
,价值
) [over_clause
]接受两个列名或表达式作为参数,第一个列名或表达式用作键,第二个列名或表达式用作值,并返回一个包含键-值对的JSON对象。返回
零
如果结果不包含行,或者发生错误。如果任何密钥名称为,则会发生错误零
或者参数的个数不等于2。从MySQL 8.0.14开始,这个函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”.mysql> SELECT o_id, attribute, value FROM t3;+------+-----------+-------+ | o_id | |属性值 | +------+-----------+-------+ | 2 | |红色| | 2 | |丝绸| | 3 |色绿色| | | 3 | |广场形状 | +------+-----------+-------+ 4行集(0.00秒)mysql >选择o_id JSON_OBJECTAGG(属性,值)> o_id t3组;+------+---------------------------------------+ | o_id | JSON_OBJECTAGG(属性值 ) | +------+---------------------------------------+ | 2 |{“颜色”:“红色”、“织物”:“丝绸”}| | 3 |{“颜色”:“绿色”、“形状”:“广场 "} | +------+---------------------------------------+ 2行集(0.00秒)
重复键处理。当规范化此函数的结果时,具有重复键的值将被丢弃。与MySQL保持一致
JSON
不允许重复键的数据类型规范,则仅在返回对象中与该键一起使用遇到的最后一个值(”最后一个重复的密钥获胜”).这意味着对a中的列使用此函数的结果选择
可能取决于行返回的顺序,但这并不保证。当作为窗口函数使用时,如果在一帧中有重复的键,结果中只显示该键的最后一个值。,则帧中最后一行键的值是确定的
命令
规范保证值具有特定的顺序。如果不是,则键的结果值是不确定的。考虑以下几点:
mysql> CREATE TABLE t(c VARCHAR(10), i INT);mysql> INSERT INTO t VALUES ('key', 3), ('key', 4), ('key', 5);查询OK, 3行影响(0.10秒)记录:3重复:0警告:0 mysql> SELECT c, i FROM t;+------+------+ | c |我 | +------+------+ | 关键关键| 3 | | | 4 | | | 5的关键 | +------+------+ 3行集(0.00秒)mysql >选择JSON_OBJECTAGG从t (c i);+----------------------+ | JSON_OBJECTAGG (c,我 ) | +----------------------+ | {" 关键”:5 } | +----------------------+ 1行集(0.00秒)mysql >删除从t;mysql> INSERT INTO t VALUES ('key', 3), ('key', 5), ('key', 4);查询OK, 3行影响(0.06秒)记录:3重复:0警告:0 mysql> SELECT c, i FROM t;+------+------+ | c |我 | +------+------+ | 关键关键| 3 | | | 5 | | | 4的关键 | +------+------+ 3行集(0.00秒)mysql >选择JSON_OBJECTAGG从t (c i);+----------------------+ | JSON_OBJECTAGG (c,我 ) | +----------------------+ | {" 键”:4 } | +----------------------+ 1行集(0.00秒)
从最后一个查询中选择的键是不确定的。如果您喜欢特定的键顺序,您可以调用
JSON_OBJECTAGG ()
作为一个窗口函数在
带有一个命令
对帧行施加特定顺序的规范。下面的例子展示了使用和不使用时会发生什么命令
对于一些不同的框架规格。没有
命令
,帧为整个分区:mysql> SELECT JSON_OBJECTAGG(c, i) OVER () AS json_object FROM t;+-------------+ | json_object | +-------------+ | {" 关键”:4}| |{“关键”:4}| |{“关键”:4 } | +-------------+
与
命令
,其中帧是的默认值无界前行和当前行之间的范围
(按升序和降序排列):SELECT JSON_OBJECTAGG(c, i) OVER (ORDER BY i) AS json_object FROM t;+-------------+ | json_object | +-------------+ | {" 关键”:3}| |{“关键”:4}| |{“关键”:5 } | +-------------+ mysql >选择JSON_OBJECTAGG (c i)在(按我DESC) json_object从t;+-------------+ | json_object | +-------------+ | {" 关键”:5}| |{“关键”:4}| |{“关键”:3 } | +-------------+
与
命令
以及整个分区的显式框架:mysql> SELECT JSON_OBJECTAGG(c, i) OVER (ORDER BY i ROWS BETWEEN UNBOUNDED previous AND UNBOUNDED FOLLOWING) AS json_object FROM t;+-------------+ | json_object | +-------------+ | {" 关键”:5}| |{“关键”:5}| |{“关键”:5 } | +-------------+
若要返回特定的键值(例如最小或最大键值),请包含
限制
子句中。例如:mysql> SELECT JSON_OBJECTAGG(c, i) OVER (ORDER BY i) AS json_object FROM t LIMIT 1;+-------------+ | json_object | +-------------+ | {" 键”:3 } | +-------------+ mysql >选择JSON_OBJECTAGG (c i)在(按我DESC) json_object从t限制1;+-------------+ | json_object | +-------------+ | {" 关键”:5 } | +-------------+
看到JSON值的规范化、合并和自动包装,以了解更多资料及例子。
的最大值
expr
.MAX ()
可接受字符串参数;在这种情况下,它返回最大字符串值。看到章节8.3.1,“MySQL如何使用索引”.的截然不同的
关键字可用于查找的不同值的最大值expr
,然而,这产生了与省略相同的结果截然不同的
.如果没有匹配的行,
MAX ()
返回零
.此函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”;它不能与截然不同的
.mysql> SELECT student_name, MIN(test_score), MAX(test_score) FROM student GROUP BY student_name
为
MAX ()
, MySQL当前比较枚举
而且集
按字符串值列,而不是按字符串在集合中的相对位置列。这不同于命令
对两者进行比较。的最小值
expr
.MIN ()
可接受字符串参数;在这种情况下,它返回最小字符串值。看到章节8.3.1,“MySQL如何使用索引”.的截然不同的
关键字可用于查找的不同值的最小值expr
,然而,这产生了与省略相同的结果截然不同的
.如果没有匹配的行,
MIN ()
返回零
.此函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”;它不能与截然不同的
.mysql> SELECT student_name, MIN(test_score), MAX(test_score) FROM student GROUP BY student_name
为
MIN ()
, MySQL当前比较枚举
而且集
按字符串值列,而不是按字符串在集合中的相对位置列。这不同于命令
对两者进行比较。返回的总体标准差
expr
.性病()
是标准SQL函数的同义词吗STDDEV_POP ()
,作为MySQL扩展提供。如果没有匹配的行,
性病()
返回零
.此函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”.返回的总体标准差
expr
.STDDEV ()
是标准SQL函数的同义词吗STDDEV_POP ()
,提供了与Oracle的兼容性。如果没有匹配的行,
STDDEV ()
返回零
.此函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”.STDDEV_POP (
expr
) [over_clause
]返回的总体标准差
expr
的平方根VAR_POP ()
).你也可以使用性病()
或STDDEV ()
,它们是等价的,但不是标准的SQL。如果没有匹配的行,
STDDEV_POP ()
返回零
.此函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”.STDDEV_SAMP (
expr
) [over_clause
]的样本标准差
expr
的平方根VAR_SAMP ()
.如果没有匹配的行,
STDDEV_SAMP ()
返回零
.此函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”.返回
expr
.如果返回集没有行,SUM ()
返回零
.的截然不同的
关键字只能用于的不同值求和expr
.如果没有匹配的行,
SUM ()
返回零
.此函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”;它不能与截然不同的
.返回的总体标准方差
expr
.它把行数视为总体,而不是样本,所以它把行数作为分母。你也可以使用方差()
,这是等价的,但不是标准SQL。如果没有匹配的行,
VAR_POP ()
返回零
.此函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”.的样本方差
expr
.也就是说,分母是行数减1。如果没有匹配的行,
VAR_SAMP ()
返回零
.此函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”.返回的总体标准方差
expr
.方差()
是标准SQL函数的同义词吗VAR_POP ()
,作为MySQL扩展提供。如果没有匹配的行,
方差()
返回零
.此函数作为窗口函数执行
over_clause
是礼物。over_clause
如所述第12.21.2节,“窗口函数概念和语法”.