日期:2014-05-16  浏览次数:20391 次

小白偶遇奇怪问题

1.select count(*) from a --500条记录
2.select COUNT(*) from a where sn in(select agreementno from b) --200条记录
3.select COUNT(*) from a where sn not in(select agreementno from b) --0条记录??? 这里应是300条吧?

2和3不是互补的语句吗

------解决方案--------------------
select COUNT(*) from a where sn not in(select agreementno from b)

是错误的,因为如果agreementno 有null的就会返回0条。

所以最好修改为:

select COUNT(*) from a where sn not in(select agreementno from b where agreementno is not null)
------解决方案--------------------
 是不是有NULL值?
------解决方案--------------------
给你count的总结,自己看吧:

Count(*)和count(1)返回组中的项数,包括NULL值和重复项。“*”指定应该计算所有行以返回表中行的总数,count(*)不需要任何参数,不能喝distinct一起使用,不使用有关任何特定列的信息。也就是说count(*)只是返回表中行数,因此SQL Server在处理count(*)的时候只需要找到属于表的数据块块头,然后计算一下行数就行了,而不用去读取里面数据列的数据。
Count(all expression)对组中的每一行都计算expression,并返回非空的数量。Expression是除text、image或ntext以外任何类型的表达式,不允许使用聚合函数和子查询。如count(column),然而是不一样的,为了去除column列中包含的NULL行,SQL Server必须读取该column的每一行的值,然后确认下是否为NULL,然后进行行计算。再如count(distinct column),因为表没有索引,在计算count()的时候是通过hash match的方式来查找相同值的行,这显然会耗费大量CPU,显然count(column)的性能会比count(distinct column)高很多(如果column有索引的话,count(distinct column)的方式会不一样,走的是group by,但同样还是会比count(column)慢)
执行效率:count(*)=count(1)>count(column)>count(distinct column)