在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"。