SQL SERVER count(*)、count(1) 和 count(字段) 有什么区别?

204 阅读1分钟

1. count(*)

  • 功能:统计所有记录的数量,无论字段是否为NULL

  • 特点

    • 不考虑字段值,只计算行数。
    • 通常是性能最优的计数方式,因为无需检查字段值。

2. count(1)

  • 功能:在每行插入一个常量值1,然后统计这些值的数量。

  • 特点

    • count(*)的结果相同(行数),但实现逻辑略有不同。
    • 在某些数据库(如 MySQL)中,count(1)可能比count(*)稍快,但在 SQL Server 中两者性能接近。

3. count (字段)

  • 功能:统计指定字段非 NULL 值的数量。

  • 特点

    • 只计算字段值不为NULL的记录。
    • 如果字段允许NULL,结果可能小于count(*)
    • 如果字段被定义为NOT NULL,则结果与count(*)相同。

性能差异

  • count(*)vscount(1) :在 SQL Server 中,两者性能几乎无差异,优化器通常会将它们视为相同操作。
  • count (字段) :如果字段允许NULL,SQL Server 需要过滤NULL值,可能导致额外开销。

示例对比

假设有表Users

ID   | Name   | Age
-------------------
1    | Alice  | 30
2    | Bob    | NULL
3    | NULL   | 25
  • SELECT COUNT(*) → 3(所有行)
  • SELECT COUNT(1) → 3(所有行)
  • SELECT COUNT(Name) → 2Name列有 2 个非 NULL 值)
  • SELECT COUNT(Age) → 2Age列有 2 个非 NULL 值)

适用场景

  • 统计总行数:推荐使用count(*),语法清晰且性能稳定。
  • 统计非 NULL 值:使用count(字段)

总结

方式统计范围NULL 处理性能建议
count(*)所有行包含所有记录总行数首选
count(1)所有行包含所有记录count(*)等效
count(字段)字段非 NULL 值忽略字段为 NULL 的记录统计非NULL值的数量