MySQL 分组聚合函数常被拿来搭配用,但其实这是两个概念,分组、聚合函数。分享这篇文章是因为今天实现某个需求时,因为分组聚合的使用,卡住没做出来。所以用个实例表回顾一些知识。
因内容比较简单,我直接分享运行 SQL 后的结果,关键部分会做说明
聚合函数
常用的聚合函数有这几个:
- avg
- max
- min
- sum
- count
以我理解,它们有两个特征:
- 对表的一列数据操作
- 每一组操作完只返回一个结果
我用如下表数据举例
count:计算一列数据所有数量
很明显,count 不会将字段的 Null 统计进去
max:获取一列数据中最大的值
这个处理的对象数据有字符串(中文、英文)、数值、日期时间。
如果是中文,将它转成拼音,按照 a-z 顺序比较,z 最大。如果前面字母一样,继续比较下一位。如果是英文,直接比较 a-z
如果是数字型字符串,按照顺序,从首字符开始比较。
上面几张图的结果都只有一个,而且都是对一列数据操作,是不是挺符合上面两个特征。
分组
分组就是按照 group by 后的字段划分,将相同的合并,异同的划分,分成一块一块
使用 group by ,后面的字段可以比 select 多,但 select 中出现的字段,一定要在 group by 中
数据一样的合并了,所以少了一行,select 可以用常量
也可以用聚合函数,所以它两经常结合一起使用,还记得上面聚合函数的两特征吗?结果只有一行,这里出现多行,因为分组了,所以 SQL 语句的执行顺序也可以看出来,先 group by 再 select
注意对比上下两张图 SQL 的区别
这是错的,还是执行顺序,group by 中怎么能用别名呢?select 是后面执行的,别名还没产生,group by 没法用,这里没报错还成功执行,因为 MySQL 特殊性,但这个 SQL 是错的
本文由老郭种树原创,转载请注明:https://guozh.net/mysql-grouping-aggregation-function/