COUNT(*)
与 COUNT(列)
在 SQL 查询中有显著的区别,主要体现在它们统计的对象和结果上。以下是两者的详细区别,并通过示例进行说明。
1. 统计对象不同
-
COUNT(*)
:统计表中所有的行数,包括所有列,不会忽略任何行,即使某些列的值为 NULL。它计算的是表中的行数,与列的具体值无关。 -
COUNT(列)
:统计指定列中非 NULL 值的数量。如果列中包含 NULL 值,则这些 NULL 值不会被计入统计结果。它计算的是某一列中非 NULL 值的数量。
2. 示例说明
假设有一个名为 employees
的表,该表有两个字段:id
(主键,非 NULL)和 email
(可能为 NULL)。
示例表 employees
:
id | |
---|---|
1 | john@example.com |
2 | NULL |
3 | jane@example.com |
示例查询 1:使用 COUNT(*)
SELECT COUNT(*) FROM employees;
结果:3
说明:查询返回了表中的所有行数,包括那些 email
字段为 NULL 的行。
示例查询 2:使用 COUNT(email)
SELECT COUNT(email) FROM employees;
结果:2
说明:查询返回了 email
列中非 NULL 值的数量。由于有一行的 email
字段为 NULL,因此不计入统计结果。
3. 性能考虑
在性能方面,COUNT(*)
和 COUNT(列)
的差异通常取决于数据库的具体实现和查询优化器的行为。
-
如果列是主键或包含索引:在某些数据库系统中,如果指定的列是主键或包含索引,
COUNT(列)
可能会利用索引来加速查询,但这并不是绝对的,取决于数据库的实现。 -
对于大多数数据库系统:
COUNT(*)
被优化为快速统计行数,因为它不需要检查列的具体值。然而,这种优化程度也取决于数据库的版本和配置。 -
InnoDB 引擎:在 MySQL 的 InnoDB 引擎中,
COUNT(*)
和COUNT(1)
在没有 WHERE 或 GROUP BY 子句的情况下,执行效率通常非常接近,因为 InnoDB 会选择最优的索引(如果有的话)来加速统计。
总结
COUNT(*)
和 COUNT(列)
在 SQL 查询中用于不同的目的。COUNT(*)
用于统计表中的行数,而 COUNT(列)
用于统计指定列中非 NULL 值的数量。在性能上,两者的差异通常不明显,但在特定情况下(如列是主键或包含索引时),COUNT(列)
可能利用索引优化查询速度。然而,这取决于数据库的具体实现和查询优化器的行为。
本文来自博客园,作者:del88,转载请注明原文链接:https://www.cnblogs.com/del88/p/18430425