創建一個測試表
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 GO21 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_1DISTINCT2 FROM dbo.T1;3 SELECT * FROM dbo.T1;
count(*)count(1)column_1column_1DISTINCT6653
可以看到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 columngroup3 FROM dbo.T14 WHERE column_2 IS NOT NULL5 )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.T13 group by column_1
column_1countcolumn_1count(*)NULL01122222311
可以看到的NULL值并沒有合計。
新聞熱點
疑難解答