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



posted @   卡卡发  阅读(788)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示