COUNT(*),count(1),COUNT(ALL expression),COUNT(DISTINCT expression)

创建一个测试表

 1 IF OBJECT_ID( 'dbo.T1' , 'U'
 2             )IS NOT NULL
 3     BEGIN
 4         DROP TABLE dbo.T1;
 5     END;
 6 GO
 7 CREATE TABLE dbo.T1( column_1 int ,column_2 varchar(30));
 8 GO
 9 
10 
11 INSERT INTO dbo.T1( column_1 , column_2                 )
12 VALUES( 1 , '123') , ( 2 , '1234') , ( 3 , '12345');
13 
14 INSERT INTO dbo.T1( column_1)
15 VALUES(1) , (2);
16 
17 INSERT INTO dbo.T1( column_2)
18 VALUES( '1234');
19 
20 GO
21 SELECT *
22   FROM dbo.T1; 
23 GO


使用各种count的方式对比结果(注意只是结果,不考虑性能,以及增加索引对于性能的影响

关于下面两者性能的对比:

SQLSERVER 里SELECT COUNT(1) 和SELECT COUNT(*)哪个性能好?

1 SELECT COUNT(*)AS 'count(*)', COUNT(1)AS 'count(1)' , COUNT( column_1)AS column_1 , COUNT( DISTINCT column_1) AS column_1DISTINCT
2     FROM dbo.T1;
3  SELECT * FROM dbo.T1;

count(*) count(1) column_1 column_1DISTINCT
6 6 5 3

可以看到count(*) 和count(1)在结果上是一致的,都是包含NULL值合计。

COUNT(ALL expression) 即 COUNT( column_1),为非NULL值得合计

COUNT(DISTINCT expression) 即 COUNT( DISTINCT column_1), 去除重复值,去除NULL后的合计结果

可以等同于以下写法

1 WITH groupby_CTE( columngroup)
2     AS (SELECT DISTINCT column_2 AS columngroup
3            FROM dbo.T1
4            WHERE column_2 IS NOT NULL
5            )
6     SELECT COUNT( *
7                 )
8       FROM groupby_CTE;


MSDN 对其解释

COUNT (Transact-SQL)
COUNT(*) 返回组中的项数。                包括 NULL 值和重复项。

COUNT(ALL expression) 对组中的每一行都计算 expression 并返回非 Null 值的数量。                           

COUNT(DISTINCT expression) 对组中的每一行都计算 expression 并返回唯一非 Null 值的数量。

 

以下是在聚合数据操作后的展现

1 select column_1,count(column_1) as 'countcolumn_1',count(*) as 'count(*)'
2 from dbo.T1
3 group by column_1

column_1 countcolumn_1 count(*)
NULL 0 1
1 2 2
2 2 2
3 1 1

可以看到的NULL值并没有合计。

 

posted @ 2015-02-09 17:55  Anderson.Ling  阅读(1005)  评论(0编辑  收藏  举报