简述count(1)、count(*)与count(列名)的执行区别 ?
参考答案:
COUNT(1)
、COUNT(*)
和 COUNT(列名)
在 SQL 查询中都是用来计数的,但它们之间的执行和效率上可能存在一些区别。
-
COUNT(1)
COUNT(1)
会计算查询结果中的行数,无论列中的值是什么。- 这里的
1
是一个常量,因此COUNT(1)
的执行效率通常与COUNT(*)
相似。 - 某些数据库优化器可能会认为
COUNT(1)
和COUNT(*)
是相同的操作,并优化为相同的查询计划。
-
COUNT(*)
COUNT(*)
会计算查询结果中的所有行数,不考虑列的值。- 在大多数数据库系统中,
COUNT(*)
是最快的,因为它只计算行数,而不需要评估每一行中的列值。 COUNT(*)
不会被特定的列名所限制,因此它通常是最通用的计数方法。
-
COUNT(列名)
COUNT(列名)
会计算查询结果中指定列的非 NULL 值数量。- 如果列中有 NULL 值,那么这些行将不会被计入总数。
- 因为
COUNT(列名)
需要评估每一行中的列值,所以它的执行效率通常比COUNT(1)
和COUNT(*)
要慢。
执行区别:
- 在执行上,
COUNT(*)
和COUNT(1)
通常具有相似的性能,因为大多数数据库优化器会优化它们为相同的查询计划。 COUNT(列名)
的性能可能会因为需要评估列值而变慢,尤其是当列上有索引时,数据库可能需要读取索引来获取列值,这可能会增加查询的开销。
总结:
- 如果只是想计算行数,不考虑列值,那么
COUNT(*)
是最好的选择。 - 如果需要计算特定列的非 NULL 值数量,那么使用
COUNT(列名)
。 - 在大多数情况下,
COUNT(1)
和COUNT(*)
的性能是相似的,可以根据个人喜好或代码一致性要求来选择使用哪一个。