You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 → 结果是UNKNOWN
  • height >= 156 → 结果也是UNKNOWN
  • UNKNOWN OR UNKNOWN → 结果还是UNKNOWN

所以这一行会被WHERE条件过滤掉,不会被count(*)统计到。

两者结果的差异

简单来说:

  • 查询B的结果 = 表的总行数(包含所有height为NULL的行)
  • 查询A的结果 = 总行数 - height为NULL的行数

关于NULL值的统计时机

  • 在查询B中:所有包含NULL值的行都会被统计,因为count(*)不关心列值,只统计行数。
  • 在查询A中:height为NULL的行不会被统计,因为WHERE条件的判断结果是UNKNOWN,这些行被过滤掉了。

内容的提问来源于stack exchange,提问作者Learner_15

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:42:50