10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

12.20.1聚合功能介绍

本节描述操作一组值的聚合函数。它们经常与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节“位函数和运算符”

  • AVG((不同的)expr

    的平均值expr.的截然不同的选项可用于返回不同值的平均值expr

    如果没有匹配的行,AVG ()返回

    SELECT student_name, AVG(test_score) FROM student GROUP BY student_name;
  • BIT_AND (expr

    返回位所有的比特expr.计算是在64位(长整型数字)的精度。

    如果没有匹配的行,BIT_AND ()返回一个中性值(所有位都设置为1)。

  • BIT_OR (expr

    返回位所有的比特expr.计算是在64位(长整型数字)的精度。

    如果没有匹配的行,BIT_OR ()返回一个中性值(所有位设置为0)。

  • BIT_XOR (expr

    返回位XOR所有的比特expr.计算是在64位(长整型数字)的精度。

    如果没有匹配的行,BIT_XOR ()返回一个中性值(所有位设置为0)。

  • 计数(expr

    返回非的数量的计数的值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,[expr…)

    返回具有不同非的行数的计数expr值。

    如果没有匹配的行,数(不同的)返回0

    SELECT COUNT(DISTINCT results) FROM student;

    在MySQL中,您可以获得不包含的不同表达式组合的数量通过给出一个表达式列表。在标准SQL中,您必须对其中的所有表达式进行连接计数(不同的…)

  • GROUP_CONCAT (expr

    这个函数返回一个带有连接的非的字符串结果一个组的值。它返回如果没有非值。完整的语法如下:

    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,在这种情况下,结果类型是VARCHARVARBINARY

    另请参阅CONCAT ()而且CONCAT_WS ()第12.8节“字符串函数和操作符”

  • JSON_ARRAYAGG (col_or_expr

    将结果集聚合为单个结果集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_OBJECTAGG (关键价值

    接受两个列名或表达式作为参数,其中第一个用作键,第二个用作值,并返回一个包含键-值对的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中新增。

  • MAX((不同的)expr

    的最大值exprMAX ()可接受字符串参数;在这种情况下,它返回最大的字符串值。看到第8.3.1节“MySQL如何使用索引”.的截然不同的关键字可以用来查找的不同值的最大值expr但是,这与省略产生相同的结果截然不同的

    如果没有匹配的行,MAX ()返回

    SELECT student_name, MIN(test_score), MAX(test_score) FROM student GROUP BY student_name;

    MAX ()MySQL当前比较枚举而且按其字符串值而不是按字符串在集合中的相对位置列。这不同于命令对两者进行比较。

  • MIN((不同的)expr

    的最小值exprMIN ()可接受字符串参数;在这种情况下,它返回最小的字符串值。看到第8.3.1节“MySQL如何使用索引”.的截然不同的关键字可以用来查找的不同值的最小值expr但是,这与省略产生相同的结果截然不同的

    如果没有匹配的行,MIN ()返回

    SELECT student_name, MIN(test_score), MAX(test_score) FROM student GROUP BY student_name;

    MIN ()MySQL当前比较枚举而且按其字符串值而不是按字符串在集合中的相对位置列。这不同于命令对两者进行比较。

  • 性病(expr

    的总体标准差expr性病()是标准SQL函数的同义词吗STDDEV_POP (),作为MySQL扩展提供。

    如果没有匹配的行,性病()返回

  • STDDEV (expr

    的总体标准差exprSTDDEV ()是标准SQL函数的同义词吗STDDEV_POP (),以兼容Oracle。

    如果没有匹配的行,STDDEV ()返回

  • STDDEV_POP (expr

    的总体标准差expr的平方根VAR_POP ()).你也可以用性病()STDDEV (),它们是等价的,但不是标准的SQL。

    如果没有匹配的行,STDDEV_POP ()返回

  • STDDEV_SAMP (expr

    的样本标准差expr的平方根VAR_SAMP ()

    如果没有匹配的行,STDDEV_SAMP ()返回

  • SUM((不同的)expr

    返回的和expr.如果返回集没有行,SUM ()返回.的截然不同的关键字只能用于对的不同值求和expr

    如果没有匹配的行,SUM ()返回

  • VAR_POP (expr

    的总体标准方差expr.它认为行数是整个总体,而不是一个样本,所以它把行数作为分母。你也可以用方差(),这是等价的,但不是标准的SQL。

    如果没有匹配的行,VAR_POP ()返回

  • VAR_SAMP (expr

    的样本方差expr.也就是说,分母是行数减1。

    如果没有匹配的行,VAR_SAMP ()返回

  • 方差(expr

    的总体标准方差expr方差()是标准SQL函数的同义词吗VAR_POP (),作为MySQL扩展提供。

    如果没有匹配的行,方差()返回