一、前言
最近在使用select查询语句时,使用了聚合函数中的count(),但是在使用时,遇到查数时有时候用count(*),有时候使用count(1),就突然好奇其区别。研究了一会,总结如下:
几乎没区别
几乎没区别的原因如下:
count(1)和count(*) 在统计数量时都可以统计Null
注:1、NULL或者null,不是空值 2、NULL与null无区别
id | type |
1 | 1 |
2 | NULL |
3 |
如上表:第二行:NULL; 第三行:空
select count(1) from table
结果为3
select count(*) from table
结果为3
补充1:count(1)和count(*)为什么会计算Null?
一、count(1)为啥会计算Null?
- 原因是count(1)是相对于count(主键)
- 对于主键的定义有一个点即不可为Null
所以综上两点:count(1)是可以统计Null
二、count(*)为啥会计算Null?
1、原因是count(*)是相对于count(非主键)
2、count(非主键)相当于扫描整个表
所以综上两点:count(*)是可以统计Null
补充2:count(1)和count(*)谁执行时间更短?
针对补充1中所述,分多种情况考虑:
- 若表无主键,则count(1)比count(*)执行时间更短。因为count(*)相当于整表的扫描。
- 若表有主键,count(*)会自动优化到主键列,此时count(1)与count(*)接近
- 若表仅一个字段,则count(*)执行时间最短
小结:
count(1)和count(*)几乎没差别,但是对sql时间要求极为严格时候使用count(1)最好,这是因为大部分表都存在主键,同时也很少表仅一个字段。