2012-06-14 122 views
1

我有一個表SQL SELECT COUNT問題

num 
---- 
NULL 
NULL 
NULL 
NULL 
55 
NULL 
NULL 
NULL 
99 

,當我寫

select COUNT(*) 
from tbl 
where num is null 

產量爲7

,但是當我寫

select COUNT(num) 
from tbl 
where num is null 

產量爲0

這兩個查詢有什麼區別?

+0

這個問題的一個可能重複http://stackoverflow.com/questions/3003457/count-vs-countcolumn-name-which-more-correct – praveen

+0

可能的重複[在SQL中,count(column)和count(*)之間的區別是什麼?](http://stackoverflow.com/questions/ 59294/in-sql-whats-the-difference-between-countcolumn-and-count) –

回答

3

區別在您選擇的字段中。

計數時COUNT(*)將考慮NULL值(計算返回的所有行)。

計數時COUNT(num)不計入NULL值(計數所有非空字段)。

這是SQL標準的行爲,無論DBMS使用

Source。看COUNT(DISTINCT EXPR,[EXPR ...])

0

count(*)返回行數count(num)返回行數num不是null。將您最後的查詢更改爲select count(*) from test where num is null以獲得您期望的結果。

0

Count(*)計數的行數,COUNT(num)計數列NUM不是空值的數量。

+0

但是'num'列中有兩個'NOT-NULL'值,所以當輸出爲0時,你不覺得它應該是2? – yogi

+2

如果你沒有添加這個where子句,情況就是這樣:其中num是空的:-) –

+0

是的,現在我知道了:) – yogi

-1

考慮上面給出的輸出,查詢計數(NUM)的結果應該是2.

+0

是的,這也是我的煩惱。但爲什麼輸出爲0. – yogi

+2

如果查詢不包含where子句只選擇那些「where num is null」的行,那麼這將是真的 –

0

在第二種情況下第一計數值被消除並且那麼子句出現在圖片中。而在第一種情況下,當您使用*行時,不會消除。

如果你指望它包含一個空科爾,你想被列入計數與空行不是使用

Count(ISNULL(col,0)) 
+0

ISNULL()是非標準SQL,可能會或可能不會工作,具體取決於OP使用的RDBMS。 –