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
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号