2024年09月05日 Oracle count * 与count 1 极客笔记

在 Oracle 数据库中,count(*) 和 count(1) 是两个常用的统计函数,用于统计表中的行数。虽然它们看起来很相似,但在实际使用中有一些微妙的区别。本文将详细讨论 count(*) 和 count(1) 的异同点,并且给出一些示例来帮助读者更好地理解它们。
count(*) 是一个聚合函数,用于统计表中的所有行数,包括包含 null 值的行。例如,以下查询将返回表 employees 中的所有行数:
SELECT count(*) FROM employees;
count(1) 也是一个聚合函数,与 count(*) 类似,用于统计表中的行数。不过,count(1) 是统计表中所有非空行的行数,null 值行不被统计。例如,以下查询将返回表 employees 中所有非空行的行数:
SELECT count(1) FROM employees;
在性能上,count(1) 会比 count(*) 稍微快一点。这是因为 count(1) 不需要去检查具体的列值是否为 null,只需遍历行数即可。而 count(*) 需要遍历所有列的值,包括 null 和非 null。
从语义的角度来看,count(1) 更直观一些。因为 count(*) 表示对所有列进行计数,有时候会引起歧义或误解。而 count(1) 明确地表示对行数进行计数,更容易理解。
在大多数情况下,count(*) 和 count(1) 可以互相替代。但在一些特殊情况下,需要根据具体情况选择合适的统计函数。例如,如果要统计某一列的非 null 值数量,可以使用 count(column_name)。
假设有一张 employees 表,结构如下:
| id | name | age | department |
|---|---|---|---|
| 1 | Alice | 25 | HR |
| 2 | Bob | 30 | Finance |
| 3 | Charlie | Marketing | |
| 4 | David | 28 | Sales |
| 5 | 32 | Operations |
我们可以用以下示例来说明 count(*) 和 count(1) 的不同:
统计 employees 表中的行数:
SELECT count(*) AS TotalRows FROM employees;
输出:
TotalRows
---------
5
统计 employees 表中非 null 行的数量:
SELECT count(1) AS NonNullRows FROM employees;
输出:
NonNullRows
-----------
4
在实际使用中,count(*) 和 count(1) 是非常有用的统计函数,能够帮助我们快速统计表中的行数。虽然它们有一些微妙的区别,但通常可以互相替代。在选择使用哪个统计函数时,可以根据具体情况灵活选择,以便更好地满足需求。
本文链接:http://so.lmcjl.com/news/12322/