首先要知道COUNT(1) 和 COUNT(*)表示的是直接查询符合条件的数据库表的行数,而COUNT(列名/字段)表示的是查询符合条件的列的值不为NULL的行数。
所以这里得出一个结论:
COUNT(1)和COUNT(*):包括对NULL的统计
COUNT(字段):不包括对NULL的统计
其次有很多关于COUNT(1)和COUNT(*)性能不同的说法(COUNT(1)比COUNT(*)性能好),但实际上,这两种查询方式在实现上没有区别,而且效率一样。
总结:
COUNT(1)和COUNT(*):包括对NULL的统计 ;COUNT(字段):不包括对NULL的统计。
COUNT(*)和COUNT(1)实现上没有区别,而且效率一样,但是COUNT(字段)需要进行字段的非NULL判断,所以效率会低一些。
效果
1、count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL。
2、count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL。
3、count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空。
效率
列名为主键,count(列名)会比count(1)快
列名不为主键,count(1)会比count(列名)快
如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)
如果有主键,则 select count(主键)的执行效率是最优的
如果表只有一个字段,则 select count(*)最优