2012-06-14 117 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。 –