我有以下疑问:

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(*)语句指示SQL Server返回表中的所有行,包括null。 COUNT(column_name)只检索行上具有非空值的行。

请参阅SQL Server 2008的测试执行代码:

-- Variable table
DECLARE @Table TABLE
(
      CustomerId int NULL 
    , Name nvarchar(50) NULL
)

-- Insert some records for tests
INSERT INTO @Table VALUES( NULL, 'Pedro')
INSERT INTO @Table VALUES( 1, 'Juan')
INSERT INTO @Table VALUES( 2, 'Pablo')
INSERT INTO @Table VALUES( 3, 'Marcelo')
INSERT INTO @Table VALUES( NULL, 'Leonardo')
INSERT INTO @Table VALUES( 4, 'Ignacio')

-- Get all the collumns by indicating *
SELECT  COUNT(*) AS 'AllRowsCount'
FROM    @Table

-- Get only content columns ( exluce NULLs )
SELECT  COUNT(CustomerId) AS 'OnlyNotNullCounts'
FROM    @Table

其他回答

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(*)语句指示SQL Server返回表中的所有行,包括null。 COUNT(column_name)只检索行上具有非空值的行。

请参阅SQL Server 2008的测试执行代码:

-- Variable table
DECLARE @Table TABLE
(
      CustomerId int NULL 
    , Name nvarchar(50) NULL
)

-- Insert some records for tests
INSERT INTO @Table VALUES( NULL, 'Pedro')
INSERT INTO @Table VALUES( 1, 'Juan')
INSERT INTO @Table VALUES( 2, 'Pablo')
INSERT INTO @Table VALUES( 3, 'Marcelo')
INSERT INTO @Table VALUES( NULL, 'Leonardo')
INSERT INTO @Table VALUES( 4, 'Ignacio')

-- Get all the collumns by indicating *
SELECT  COUNT(*) AS 'AllRowsCount'
FROM    @Table

-- Get only content columns ( exluce NULLs )
SELECT  COUNT(CustomerId) AS 'OnlyNotNullCounts'
FROM    @Table

最好使用

Count(1) in place of column name or * 

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

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

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