我有以下查询:
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(*)
将在结果中返回一个额外的行,其中包含a null
和null
列中的值计数.
count(*)
计数NULL而count(column)
不是
[edit]添加了此代码,以便人们可以运行它
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
使用*和特定列之间的另一个细微差别是,在列情况下,您可以添加关键字DISTINCT,并将计数限制为不同的值:
select column_a, count(distinct column_b) from table group by column_a having count(distinct column_b) > 1;
另一个也许是微妙的区别是,在某些数据库实现中,count(*)是通过查看有问题的表上的索引而不是实际的数据行来计算的.由于没有指定特定的列,因此无需担心实际的行及其值(如果您计算了特定的列,则会如此).允许数据库使用索引数据可能比将其计为"实际"行要快得多.
文档中的解释有助于解释这一点:
COUNT(*)返回组中的项目数,包括NULL值和重复项.
COUNT(表达式)计算组中每行的表达式,并返回非空值的数量.
因此count(*)包含空值,另一种方法则不包含空值.
我们可以使用Stack Exchange Data Explorer来说明与简单查询的区别.Stack Overflow数据库中的Users表具有通常留空的列,如用户的网站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
.