我有以下查询:
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列中的值。
答案 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)
请参阅下面的测试执行代码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 *
,...)