mysql中聚合函数对null值的处理
(1)max、min、avg和sum
直接忽略null,不参与运算。
(2)count:
-
count(*):返回的是所有记录的总和,含有null值的记录不会被忽略,也会被计算在内
-
count(column_name):如果这个列名中含有一个值为null,则该条记录会被忽略,此时的返回值为count(*)-1
-
count(1):和count(*)一样,包含null值
3)count(*) 和count(1)区别
-
count(1):其实就是计算一共有多少符合条件的行。1并不是表示第一个字段,而是表示一个固定值。其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1。
-
count(*):执行时会把星号翻译成字段的具体名字,效果也是一样的,不过多了一个翻译的动作,比固定值的方式效率稍微低一些
4)count效率问题
说法一
-
列名为主键,count(列名)会比count(1)快
-
列名不为主键,count(1)会比count(列名)快
-
如果表只有一个字段,则 select count(*)最优
说法二
- count(主键id)
InnoDB引擎会遍历整张表,把每一行的id值都取出来,返回给server层。server层拿到id后,判断是不可能为空的,就按行累加。
- count(1)
同样遍历整张表,但不取值,server层对返回的每一行,放一个数字1进去,判断是不可能为空的,按行累加。
- count(字段)
为not null时:逐行从记录里面读出这个字段,判断不可能为null,累加
为null时:执行时,判断到有可能是null,还要把值取出来再判断一下,不是null才累加
- count(*)
需要注意的是,并不是带了就把所有值取出来,而是mysql做了专门的优化,count()肯定不是null,按行累加。
从上面的执行结果,基于MySQL的Innodb存储引擎,count(字段)<count(主键id)<count(1)≈count(*)
参考连接:
https://baijiahao.baidu.com/s?id=1726075901139220538&wfr=spider&for=pc
https://baijiahao.baidu.com/s?id=1728733605304857364&wfr=spider&for=pc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)