在SQL中,count(列)和count(*)之间有什么区别?

时间:2008-09-12 15:27:17

标签: sql

我有以下查询:

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

count(column_name)的所有来电替换为count(*)会有什么不同?

这个问题的灵感来自How do I find duplicate values in a table in Oracle?


为了澄清已接受的答案(也许是我的问题),将count(column_name)替换为count(*)会在结果中返回一个额外的行,其中包含null且计数为{{1列中的值。

11 个答案:

答案 0 :(得分:226)

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

答案 1 :(得分:36)

使用*和特定列之间的另一个细微差别是,在列案例中,您可以添加关键字DISTINCT,并将计数限制为不同的值:

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

答案 2 :(得分:16)

另一个也许是微妙的区别在于,在某些数据库实现中,count(*)是通过查看有问题的表上的索引而不是实际的数据行来计算的。由于没有指定特定的列,因此无需为实际的行及其值而烦恼(如果您计算了特定的列,则会如此)。允许数据库使用索引数据可能比使其成为“实际”行要快得多。

答案 3 :(得分:10)

docs中的解释有助于解释这一点:

  

COUNT(*)返回组中的项目数,包括NULL值和重复项。

     

COUNT(表达式)计算组中每一行的表达式,并返回非空值的数量。

因此count(*)包含空值,另一种方法则不包括。

答案 4 :(得分:10)

我们可以使用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

如果您在Data Explorer中运行上述查询,您会发现count(Id)count(*)的计数相同,因为Id列没有允许null值。但WebsiteUrl计数要低得多,因为该列允许null

答案 5 :(得分:2)

基本上COUNT(*)函数返回表中的所有行,而COUNT(COLUMN_NAME)则不返回;也就是说,它排除了空值,这里的每个人都在这里也回答过。 但最有趣的部分是使查询和数据库优化,最好使用COUNT(*),除非进行多次计数或复杂查询而不是COUNT(COLUMN_NAME)。否则,在处理大量数据时,它会真正降低数据库性能。

答案 6 :(得分: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

答案 7 :(得分:1)

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

COUNT(Column Name) –返回非NULL记录的总数。这意味着,它将忽略对特定列中的NULL值记录进行计数。

答案 8 :(得分:0)

最好使用

Count(1) in place of column name or * 

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

答案 9 :(得分:0)

如果您的表中有一列已修复没有区别,如果您想使用多个列而不是指定需要计算多少列......

谢谢,

答案 10 :(得分:0)

如前面的答案中所述,Count(*)甚至计算NULL列,而count(Columnname)仅在列具有值时计数。

最好避免使用*Select *count *,...)