本节描述操作一组值的聚合函数。它们经常与a连用集团
子句将值分组到子集中。
表12.25聚合函数
的名字 | 描述 | 介绍了 |
---|---|---|
AVG () |
返回参数的平均值 | |
BIT_AND () |
返回位和 | |
BIT_OR () |
返回位或 | |
BIT_XOR () |
返回按位异或 | |
COUNT () |
返回返回的行数的计数 | |
数(不同的) |
返回多个不同值的计数 | |
GROUP_CONCAT () |
返回一个连接的字符串 | |
JSON_ARRAYAGG () |
返回结果集作为单个JSON数组 | 5.7.22 |
JSON_OBJECTAGG () |
返回结果集作为单个JSON对象 | 5.7.22 |
MAX () |
返回最大值 | |
MIN () |
返回最小值 | |
性病() |
返回总体标准差 | |
STDDEV () |
返回总体标准差 | |
STDDEV_POP () |
返回总体标准差 | |
STDDEV_SAMP () |
返回样本标准差 | |
SUM () |
返回总和 | |
VAR_POP () |
返回总体标准方差 | |
VAR_SAMP () |
返回样本方差 | |
方差() |
返回总体标准方差 |
除非另有说明,聚合函数忽略零
值。
如果在包含no的语句中使用聚合函数集团
子句,它等价于对所有行进行分组。有关更多信息,请参见章节12.20.3,“MySQL对GROUP BY的处理”.
对于数值参数,方差和标准差函数返回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 ()
聚合函数执行位操作。他们需要长整型数字
(64位整数)参数并返回长整型数字
值。其他类型的实参被转换为长整型数字
截断可能会发生。有关MySQL 8.0中允许位操作接受二进制字符串类型参数的更改的信息(二进制
,VARBINARY
,团
类型),看第12.13节“位函数和运算符”.
的平均值
.的expr
截然不同的
选项可用于返回不同值的平均值expr
.如果没有匹配的行,
AVG ()
返回零
.SELECT student_name, AVG(test_score) FROM student GROUP BY student_name;
返回位
和
所有的比特expr
.计算是在64位(长整型数字
)的精度。如果没有匹配的行,
BIT_AND ()
返回一个中性值(所有位都设置为1)。返回位
或
所有的比特expr
.计算是在64位(长整型数字
)的精度。如果没有匹配的行,
BIT_OR ()
返回一个中性值(所有位设置为0)。返回位
XOR
所有的比特expr
.计算是在64位(长整型数字
)的精度。如果没有匹配的行,
BIT_XOR ()
返回一个中性值(所有位设置为0)。返回非的数量的计数
零
的值expr
检索的行中选择
声明。结果是长整型数字
价值。如果没有匹配的行,
COUNT ()
返回0
.mysql> SELECT student.student_name,COUNT(*) FROM student,course WHERE student.student_id=course。组名:
COUNT (*)
是否有些不同,因为它返回检索的行数的计数,不管它们是否包含零
值。对于事务性存储引擎,例如
InnoDB
,存储准确的行数是有问题的。多个事务可能同时发生,每一个事务都可能影响计数。InnoDB
不保留表中行的内部计数,因为并发事务可能会这样做”看到”同一时间的行数不同。因此,SELECT COUNT (*)
语句只计算当前事务可见的行。在MySQL 5.7.18之前,
InnoDB
流程SELECT COUNT (*)
语句,通过扫描聚集索引。从MySQL 5.7.18,InnoDB
流程SELECT COUNT (*)
语句,遍历最小的可用二级索引,除非索引或优化器提示指示优化器使用不同的索引。如果辅助索引不存在,则扫描聚集索引。处理
SELECT COUNT (*)
如果索引记录不完全在缓冲池中,语句会花费一些时间。为了更快地进行计数,请创建一个计数器表,并让应用程序根据它所做的插入和删除操作来更新它。但是,在数千个并发事务正在对同一个计数器表发起更新的情况下,这种方法可能无法很好地扩展。如果大约的行数足够,则使用显示表状态
.InnoDB
处理SELECT COUNT (*)
而且选择统计(1)
操作方式相同。没有性能差异。为
MyISAM
表,COUNT (*)
被优化为如果选择
从一个表检索,不检索其他列,也没有在哪里
条款。例如:SELECT COUNT(*) FROM student;
此优化只适用于
MyISAM
表,因为这个存储引擎存储了准确的行数,并且可以非常快速地访问。数(1)
只有当第一列定义为非空
.返回具有不同非的行数的计数
零
expr
值。如果没有匹配的行,
数(不同的)
返回0
.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 student_name, GROUP_CONCAT(test_score) FROM student GROUP BY student_name;
或者:
SELECT student_name, GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ') FROM student GROUP BY student_name;
在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
.将结果集聚合为单个结果集
JSON
数组,其元素由行组成。该数组中元素的顺序未定义。该函数作用于计算结果为单个值的列或表达式。返回零
如果结果不包含行,或者发生错误。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秒)
在MySQL 5.7.22中新增。
接受两个列名或表达式作为参数,其中第一个用作键,第二个用作值,并返回一个包含键-值对的JSON对象。返回
零
如果结果不包含行,或者发生错误。如果任何密钥名是,则会发生错误零
或者说参数的个数不等于2。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的列上使用此函数的结果选择
可以依赖于返回行的顺序,但不能保证。考虑以下:
CREATE TABLE t(c VARCHAR(10), i INT);查询OK, 0行影响(0.33秒)mysql> INSERT INTO t VALUES ('key', 3), ('key', 4), ('key', 5);查询OK, 3 rows affected (0.10 sec) Records: 3 duplicate: 0 Warnings: 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;查询OK, 3行影响(0.08秒)mysql> INSERT INTO t VALUES ('key', 3), ('key', 5), ('key', 4);查询OK, 3 rows affected (0.06 sec) Records: 3 duplicate: 0 Warnings: 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值的规范化、合并和自动包装,以获取更多信息和示例。
在MySQL 5.7.22中新增。
的最大值
expr
.MAX ()
可接受字符串参数;在这种情况下,它返回最大的字符串值。看到第8.3.1节“MySQL如何使用索引”.的截然不同的
关键字可以用来查找的不同值的最大值expr
但是,这与省略产生相同的结果截然不同的
.如果没有匹配的行,
MAX ()
返回零
.SELECT student_name, MIN(test_score), MAX(test_score) FROM student GROUP BY student_name;
的最小值
expr
.MIN ()
可接受字符串参数;在这种情况下,它返回最小的字符串值。看到第8.3.1节“MySQL如何使用索引”.的截然不同的
关键字可以用来查找的不同值的最小值expr
但是,这与省略产生相同的结果截然不同的
.如果没有匹配的行,
MIN ()
返回零
.SELECT student_name, MIN(test_score), MAX(test_score) FROM student GROUP BY student_name;
的总体标准差
expr
.性病()
是标准SQL函数的同义词吗STDDEV_POP ()
,作为MySQL扩展提供。如果没有匹配的行,
性病()
返回零
.的总体标准差
expr
.STDDEV ()
是标准SQL函数的同义词吗STDDEV_POP ()
,以兼容Oracle。如果没有匹配的行,
STDDEV ()
返回零
.的总体标准差
expr
的平方根VAR_POP ()
).你也可以用性病()
或STDDEV ()
,它们是等价的,但不是标准的SQL。如果没有匹配的行,
STDDEV_POP ()
返回零
.的样本标准差
expr
的平方根VAR_SAMP ()
.如果没有匹配的行,
STDDEV_SAMP ()
返回零
.返回的和
expr
.如果返回集没有行,SUM ()
返回零
.的截然不同的
关键字只能用于对的不同值求和expr
.如果没有匹配的行,
SUM ()
返回零
.的总体标准方差
expr
.它认为行数是整个总体,而不是一个样本,所以它把行数作为分母。你也可以用方差()
,这是等价的,但不是标准的SQL。如果没有匹配的行,
VAR_POP ()
返回零
.的样本方差
expr
.也就是说,分母是行数减1。如果没有匹配的行,
VAR_SAMP ()
返回零
.的总体标准方差
expr
.方差()
是标准SQL函数的同义词吗VAR_POP ()
,作为MySQL扩展提供。如果没有匹配的行,
方差()
返回零
.