计数函数有几种写法,count(1),count(字段),count(*),他们的区别如下:
COUNT(expr) ,返回SELECT语句检索的行中expr的值不为NULL的数量。COUNT(*)
的统计结果中,会包含值为NULL的行数。基于这个条件,count(1),count(*)里面都有明确的值,将返回所有符合查询条件的数据;count(字段)会在查询条件的基础上过滤字段为NULL的数据。
初次看到这样的解释还是比较迷惑,简单理解可以把COUNT里面的值当做一个查询条件,当为1或者*的时候相当于where 1=1,当为某个字段的时候相当于增加了一个条件where 字段 is not null。
count(*)为标准的sql语法,在这个语句上专门做了优化,如果没有查询条件的情况下,count(*)会直接从元数据表中读取记录的数据行数,这是最快的。如果有查询条件执行器会选择最优的路径的执行,例如索引优先,非聚集索引优先等。
count(1)和count(*)在各个方面没有差别,是一样的执行方式;count(字段)会执行全表扫描并且增加字段非空条件;推荐使用count(*),因为是标准语法。