跳到主要内容

简述count(1)、count(*)与count(列名)的执行区别 ?

参考答案:

COUNT(1)COUNT(*)COUNT(列名) 在 SQL 查询中都是用来计数的,但它们之间的执行和效率上可能存在一些区别。

  1. COUNT(1)

    • COUNT(1) 会计算查询结果中的行数,无论列中的值是什么。
    • 这里的 1 是一个常量,因此 COUNT(1) 的执行效率通常与 COUNT(*) 相似。
    • 某些数据库优化器可能会认为 COUNT(1)COUNT(*) 是相同的操作,并优化为相同的查询计划。
  2. COUNT(*)

    • COUNT(*) 会计算查询结果中的所有行数,不考虑列的值。
    • 在大多数数据库系统中,COUNT(*) 是最快的,因为它只计算行数,而不需要评估每一行中的列值。
    • COUNT(*) 不会被特定的列名所限制,因此它通常是最通用的计数方法。
  3. COUNT(列名)

    • COUNT(列名) 会计算查询结果中指定列的非 NULL 值数量。
    • 如果列中有 NULL 值,那么这些行将不会被计入总数。
    • 因为 COUNT(列名) 需要评估每一行中的列值,所以它的执行效率通常比 COUNT(1)COUNT(*) 要慢。

执行区别

  • 在执行上,COUNT(*)COUNT(1) 通常具有相似的性能,因为大多数数据库优化器会优化它们为相同的查询计划。
  • COUNT(列名) 的性能可能会因为需要评估列值而变慢,尤其是当列上有索引时,数据库可能需要读取索引来获取列值,这可能会增加查询的开销。

总结

  • 如果只是想计算行数,不考虑列值,那么 COUNT(*) 是最好的选择。
  • 如果需要计算特定列的非 NULL 值数量,那么使用 COUNT(列名)
  • 在大多数情况下,COUNT(1)COUNT(*) 的性能是相似的,可以根据个人喜好或代码一致性要求来选择使用哪一个。