我有以下疑问:

select column_name, count(column_name)
from table
group by column_name
having count(column_name) > 1;

如果我将所有对count(column_name)的调用替换为count(*),会有什么不同?

这个问题的灵感来自于如何在Oracle中查找表中的重复值。


为了澄清接受的答案(可能是我的问题),将count(column_name)替换为count(*)将在结果中返回一个额外的行,其中包含null值和列中空值的计数。


当前回答

最好使用

Count(1) in place of column name or * 

要计算表中的行数,它比任何格式都要快,因为它从不检查表中的列名是否存在

其他回答

正如前面的回答中提到的,Count(*)甚至对NULL列进行计数,而Count(Columnname)仅在列有值时计数。

最好的做法是避免* (Select *, count *,…)

使用*和特定列之间的另一个微小区别是,在列的情况下,你可以添加关键字DISTINCT,并将计数限制为不同的值:

select column_a, count(distinct column_b)
from table
group by column_a
having count(distinct column_b) > 1;

COUNT(*) -返回表中记录的总数(包括NULL值记录)。

COUNT(列名)-返回非null记录的总数。这意味着,它忽略该特定列中NULL值记录的计数。

另一个细微的区别是,在某些数据库实现中,count(*)是通过查看相关表上的索引来计算的,而不是实际的数据行。由于没有指定特定的列,因此不需要考虑实际的行及其值(如果计算特定的列,就会遇到这种情况)。允许数据库使用索引数据比让它计算“真实的”行要快得多。

文档中的解释有助于解释这一点:

COUNT(*)返回组中的项数,包括NULL值和重复项。 COUNT(表达式)计算组中每一行的表达式,并返回非空值的数目。

所以count(*)包含空值,其他方法不包含。