MySQL版本:5.7+

  本节介绍对值的集合进行操作的组合(聚合)函数。翻译自:Aggregate (GROUP BY) Function Descriptions

一、MySQL 5.7中的聚合函数

  MySQL 5.7中的聚合函数如下:

  除非另有说明,否则组合函数会忽略NULL值。

  如果在不包含Group By子句的语句中使用组合函数,就等效于对所有行进行分组。(个人理解是,结果总是只有一行。)关于这点的更多信息,后面的小节“MySQL处理Group By的方式”会讲到。

  聚合函数中,方差和标准差函数会对数值参数返回DOUBLE值。SUM()和AVG()对精确值参数(integer或DECIMAL)返回DECIMAL值,而对近似值参数(FLOAT或DOUBLE)返回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节。

二、聚合函数详解

  2.1 AVG()

AVG([DISTINCT] expr)

  函数返回expr的平均值。

  DISTINCT则用于返回expr的不同值的平均值。

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

  2.2 COUNT()

COUNT(expr)

  返回SELECT语句检索的行中expr的非NULL值的计数。

  返回结果是BIGINT值。

  如果没有匹配的行,count()返回0.

  

  count(*)有些不同,它返回取回的行的行数的计数,无论它们是否包含NULL值。

  对于诸如InnoDB之类的事务存储引擎,存储精确的行数是有问题的。多个事务可能同时发生,每个事务都可能影响计数。

  所以InnoDB不在内部保留表的行数,因为并发事务可能同时“看到”不同数量的行。因此,SELECT COUNT(*)语句只计算当前事务可见的行。

  在MySQL 5.7.18之前,InnoDB通过扫描聚集索引(clustered index)来处理SELECT COUNT(*)语句。从MySQL 5.7.18开始,InnoDB通过遍历最小的可用二级索引来处理SELECT COUNT(*)语句,除非索引或优化器提示指示优化器使用不同的索引。如果不存在辅助索引,则扫描聚集索引。

  如果索引记录不完全在缓冲池中,那么处理select count(*)语句需要一些时间。为了更快地计算,可以创建一个计数表,让应用程序根据插入和删除操作更新它。但是,在数千个并发事务正在启动对同一计数器表的更新的情况下,此方法可能无法很好地扩展。因此,如果大概的行数可以满足需求,请使用SHOW TABLE STATUS。

  对于MyISAM表,如果SELECT从一个表没有检索到其他列,并且没有WHERE子句,而只返回COUNT(*)的结果,则COUNT(*)会被优化,可以快速返回。例如:

 SELECT COUNT(*) FROM student;

  此优化仅适用于MyISAM表,因为为此存储引擎存储了精确的行数,并且可以非常快速地访问。COUNT(1)则仅在第一列定义为NULL时,受到相同额度优化。

  2.3 COUNT(DISTINCT ...)

COUNT(DISTINCT expr,[expr...])

  函数返回返回不相同且非NULL的expr值的行数。

  如果没有匹配的行,则COUNT(DISTINCT)返回0。

  在MySQL中,您可以通过提供表达式列表,来获取不包含NULL的不同表达式组合的数量。而在标准表达式中,必须在COUNT(DISTINCT ...)中对所有表达式进行连接。

  2.4 GROUP_CONCAT()

GROUP_CONCAT([DISTINCT] expr [,expr ...][ORDER BY {unsigned_integer | col_name | expr}[ASC | DESC] [,col_name ...]][SEPARATOR str_val])

  这个函数把来自同一个组的某一列(或者多列)的数据连接起来成为一个字符串。

  如果没有非NULL值,返回NULL。

  示例如下:

/*001*/
/*成绩表中只对学生ID分组*/
select SId, group_concat(cId),group_concat(score) from sc group by SId;

  结果如下,并没有排序

/*002*/
/*排序后连接,改变分隔符*/
select SId, group_concat(cId),group_concat(score order by score desc separator '  ')
from sc group by SId;

  结果如下:

  至于对多个expr的连接,试了试,会把两个字段无缝连在一起。

select SId, group_concat(cId,score),group_concat(score) from sc group by SId;

  Group_Concat()的结果将截断为group_concat_max_len系统变量所设置的最大长度,该变量的默认值为1024。

  而返回值是非二进制或二进制字符串,具体取决于参数是非二进制还是二进制字符串。

  返回的结果类型为TEXT或BLOB,除非group_concat_max_len小于或等于512,这种情况下,结果类型为VARCHAR或VARBINARY。

  2.5 JSON_ARRAYAGG(col or expr)

  将结果集聚合为单个JSON数组,其元素由参数列的值组成。此数组中元素的顺序未定义。该函数作用于计算为单个值的列或表达式。

  异常返回NULL。

  示例如下:

  2.6 JSON_OBJECTAGG(key,value)

  两个列名或表达式作为参数,第一个用作键,第二个用作值,并返回包含键值对的JSON对象。

  如果结果不包含任何行,或者出现错误,则返回NULL。如果任何键名称为NULL或参数数量不等于2,则会发生错误。

  如何处理重复key,参考原文此处。

  2.7 其余函数

  位函数进行位操作。

  标准差和方差函数,为了兼容有不同的函数名。

  详见原文档。

  

转载于:https://www.cnblogs.com/bigbigbigo/p/10952895.html

MySQL 聚合函数(一)聚合(组合)函数概述相关推荐

  1. JS高级——纯函数、柯里化(手写自动柯里化函数)、组合函数(手写自动组合函数)

    一.理解JavaScript纯函数 函数式编程中有一个非常重要的概念叫纯函数,JavaScript符合函数式编程的范式,所以也有纯函数的概念: 在react开发中纯函数是被多次提及的: 比如react ...

  2. python基础入门:内置函数之排列组合函数教程

    product 笛卡尔积 (有放回抽样排列) permutations 排列 (不放回抽样排列) combinations 组合,没有重复 (不放回抽样组合) combinations_with_re ...

  3. 纯函数、柯里化、组合函数的解析以及代码实现

    文章目录 一.纯函数的概念和理解 二.JavaScript柯里化 1.柯里化的理解 2.将函数柯里化的代码实现 三.组合函数 1.组合函数的理解 2.通用的组合函数的实现 一.纯函数的概念和理解 纯函 ...

  4. 【JS函数】JS函数之高阶函数、组合函数、函数柯里化

    自我介绍:大家好,我是吉帅振的网络日志:微信公众号:吉帅振的网络日志:前端开发工程师,工作4年,去过上海.北京,经历创业公司,进过大厂,现在郑州敲代码. JS函数专栏 1[JS函数]JS函数之普通.构 ...

  5. JavaScript函数式编程(纯函数、柯里化以及组合函数)

    JavaScript函数式编程(纯函数.柯里化以及组合函数) 目录 JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 1.纯函数 1.1.纯函数的概念 1.2.副作用 1.3.纯函数 ...

  6. JavaScript组合函数的理解

    组合(Compose)函数是在JavaScript开发过程中一种对函数的使用技巧.模式: 1.比如我们现在需要对某一个函数进行函数的调用,执行两个函数fn1和fn2,这两个函数是依次执行的: 2.那么 ...

  7. mysql的所有聚合函数_MySQL 聚合函数(一)聚合(组合)函数概述

    MySQL版本:5.7+ 一.MySQL 5.7中的聚合函数 MySQL 5.7中的聚合函数如下: 除非另有说明,否则组合函数会忽略NULL值. 如果在不包含Group By子句的语句中使用组合函数, ...

  8. MySql基础篇---002 SQL之SELECT使用篇: 基本的SELECT语句,运算符,排序与分页,多表查询,单行函数,聚合函数,子查询

    第03章_基本的SELECT语句 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑 ...

  9. mysql中常见的聚合函数

    1. 聚合函数的介绍 聚合函数又叫组函数,通常是对表中的数据进行统计和计算,一般结合分组(group by)来使用,用于统计和计算分组数据. 常用的聚合函数: count(col): 表示求指定列的总 ...

  10. MySQL中的组函数(聚合函数)

    MySQL中的组函数(聚合函数) 组函数操作行集,给出每组的结果.组函数不象单行函数,组函数对行的集合进行操 作,对每组给出一个结果.这些集合可能是整个表或者是表分成的组. 一.组函数与单行函数的区别 ...

最新文章

  1. Vue 组件间通信方法汇总
  2. 解决Centos6.5虚拟机上网问题
  3. 分类VS标签,一文带你看懂数据中台为什么要建标签体系?
  4. Knight Moves
  5. 秦九韶算法matlab程序,数值分析matlab程序实例.doc
  6. Java中当前的时间的各种写法
  7. 身为数据科学家怎么能不掌握这四大技能!
  8. 整理了vue2.0的思维导图
  9. 重磅!AI大牛邢波出任AI大学校长,李开复姚期智都是校董
  10. Kubernetes学习总结(15)—— Kubernetes 实战之部署 Mysql 集群
  11. 【笔记】工具 - 输入法 - rime 小狼毫(weasel)
  12. shell卸载 simatic_西门子软件在WIN7操作系统中安装步骤和须知
  13. OpenModelica中的可视化仿真
  14. 3dmax最基础的建模教程,初学者福利
  15. CSS 基础3(内边距、外边距、边距模型)
  16. 骁龙835(MSM8998)芯片数据参考
  17. 【过程4】——时间过得很快你的变化也很大
  18. 七天百度飞桨强化学习心得
  19. linux 内核源码下载
  20. DocArray 0.21.0版本发布!新增OpenSearch后端存储,支持Redis后端存储的多语言文本搜索!...

热门文章

  1. socket通信原理简介
  2. Linux系统基本操作(二)—设置本地光盘为yum源
  3. 关于bootstrap的table表显示无法找到匹配内容的问题随笔
  4. android自定义滚轴选择器_Android自定义控件实战—滚动选择器PickerView
  5. 计算机二级c语言模拟题,2016下半年计算机二级C语言模拟试题及答案
  6. php输出字符unicode码,PHP解码unicode编码的中文字符代码分享
  7. pythonturtle库画图_python 用turtle库画图
  8. 开关怎么使用_智能数显压力开关怎么使用?
  9. python类加载_如何重新加载一个类在python shell?
  10. avg最多用多少列 mysql_使用MySQL中的AVG函数求平均值的教程