在SQL中,count(column)和count(*)有什么区别?

时间:2020-03-05 18:52:18  来源:igfitidea点击:

我有以下查询:

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和$ null`值的计数柱子。

解决方案

回答

count(*)计数为NULL,而count(column)不计数

[编辑]添加了此代码,以便人们可以运行它

create table #bla(id int,id2 int)
insert #bla values(null,null)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,null)

select count(*),count(id),count(id2)
from #bla

结果
7 3 2

回答

文档中的解释有助于对此进行解释:

COUNT(*) returns the number of items in a group, including NULL values and duplicates.
  
  COUNT(expression) evaluates expression for each row in a group and returns the number of nonnull values.

因此count(*)包含null,而其他方法则不包含null。

回答

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

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

回答

另一个甚至微妙的区别是,在某些数据库实现中,count(*)是通过查看相关表的索引而不是实际数据行来计算的。由于未指定特定的列,因此无需理会实际的行及其值(就像我们对特定的列进行计数一样)。允许数据库使用索引数据可能比使它计数"真实"行快得多。

回答

我们可以使用Stack Exchange Data Explorer通过一个简单的查询来说明差异。 Stack Overflow数据库中的"用户"表中的列通常为空白,例如用户的"网站URL"。

-- count(column_name) vs. count(*)
-- Illustrates the difference between counting a column
-- that can hold null values, a  'not null' column, and  count(*)

select count(WebsiteUrl), count(Id), count(*) from Users

如果我们在数据浏览器中运行上述查询,我们会发现count(Id)和count(*)的计数是相同的,因为" Id"列不允许使用" null"值。但是," WebsiteUrl"计数要低得多,因为该列允许" null"。