SQL中NULL值的统计时机及两类COUNT查询结果差异疑问
关于两个COUNT查询与NULL值的差异分析
嘿,这个问题问到点子上了!NULL在SQL的逻辑判断里确实是个容易让人迷糊的点,我来给你理清楚这两个查询的区别,以及NULL值在其中的统计规则:
先看查询B:select count(*) from person;
这个查询很直接——count(*)的作用就是统计表中的所有行数,不管任何列的值是不是NULL。哪怕某一行的height是NULL,甚至所有列都是NULL,这一行都会被算进去。所以查询B的结果就是person表的总行数。
再看查询A:select count(*) from person where person.height < 156 or person.height >= 156;
这里的关键是理解SQL对NULL的逻辑判断规则:任何和NULL进行比较的操作,结果都是UNKNOWN(既不是TRUE也不是FALSE)。而WHERE子句只会保留判断结果为TRUE的行,UNKNOWN和FALSE的行都会被过滤掉。
那当height是NULL的时候:
height < 156→ 结果是UNKNOWNheight >= 156→ 结果也是UNKNOWNUNKNOWN OR UNKNOWN→ 结果还是UNKNOWN
所以这一行会被WHERE条件过滤掉,不会被count(*)统计到。
两者结果的差异
简单来说:
- 查询B的结果 = 表的总行数(包含所有
height为NULL的行) - 查询A的结果 = 总行数 -
height为NULL的行数
关于NULL值的统计时机
- 在查询B中:所有包含NULL值的行都会被统计,因为
count(*)不关心列值,只统计行数。 - 在查询A中:
height为NULL的行不会被统计,因为WHERE条件的判断结果是UNKNOWN,这些行被过滤掉了。
内容的提问来源于stack exchange,提问作者Learner_15
相关产品推荐
相关产品推荐

