SQL是null和= null

174

9
由于任何与NULL进行算术比较的结果都是NULL,因此您无法从这样的比较中获得任何有意义的结果 -http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html - scibuff
'is null' 也可以作为一个函数使用。请查看:https://www.w3schools.com/sql/sql_isnull.asp - Channa
你使用哪个数据库管理系统?下面有几个针对特定产品的答案正在获得赞同。 - jarlh
这是一个已经被问过的问题,有各种解决方案可用,https://www.sqlservercentral.com/articles/understanding-the-difference-between-is-null-and-null - Arqam Rafay
4个回答

190
在SQL中,使用比较运算符(例如=!=<等)将null值与任何其他值(包括另一个null)进行比较,结果为null,这被认为是where子句的false(严格来说,它是“不是真实的”,而不是“false”,但效果相同)。
其原因是null意味着“未知”,因此与null进行任何比较的结果也是“未知”。因此,通过编码where my_column = null将不能对行进行命中。
SQL提供了测试列是否为null的特殊语法,即is nullis not null,这是一种特殊条件,用于测试null(或非null)。
下面是一些SQL,展示了各种条件及其根据上述规则的效果。
create table t (x int, y int);
insert into t values (null, null), (null, 1), (1, 1);

select 'x = null' as test , x, y from t where x = null
union all
select 'x != null', x, y from t where x != null
union all
select 'not (x = null)', x, y from t where not (x = null)
union all
select 'x = y', x, y from t where x = y
union all
select 'not (x = y)', x, y from t where not (x = y);

只返回1行(预期):

TEST    X   Y
x = y   1   1

点击此处查看在 SQLFiddle 上的运行结果。


1
鉴于 NULL = NULL 不是 true,我们可以得出结论:在 = 运算符的两侧,null 的语义含义是不同的。在左侧,它是一个概念;在右侧,它是一个谓词(即“未知”与“是未知的”)。这些本质上是不相等的。▮ - Mardoxx
1
不,NULL 的语义意义只是“未知”。它不是一个值,也不能像值一样进行推理。NULL = NULL 不成立的原因是因为你无法比较你没有了解的事物,这就是 NULL 所代表的。宇宙中的星星数量是否等于沙粒数量?谁知道呢?答案是 NULL(未知)。 - bornfromanegg

93

需要注意的是,NULL并不等于NULL

NULL不是一个值,因此无法与另一个值进行比较。

where x is null检查x是否为空值。

where x = null检查x是否等于NULL,这将永远不会成立。


1
空值是一种值,它只是未知的值。就像在编程语言中变量可以有空值一样。此外,您可以比较 if (varA != null)。在 SQL 中,正如您所指出的那样,它有不同的处理方式。 - broadband
@broadband:null 不是一个值,就像无穷大不是一个数字。这更多是一种哲学上的东西... 是的,你可以将 "null" 赋给一个变量,但那只意味着你正在取消或重置该变量。0 或 "" 将是一个值,但 null 实际上意味着 "这个变量没有值"。 - Sygmoral
@Sygmoral 在 C# 中,当你写字符串 a = null 时,它意味着你将值 null 赋给了变量 a。但对于程序员来说,这个解释就像是在说:“这个变量没有值”。此外,在 SQL 中,null 可以有多种解释或三值逻辑。 - broadband
@Sygmoral,如果您查看Bohemian的答案,他指出:“在SQL中,对null值进行比较”。他还在谈论值。 - broadband

10

首先,正确的方法是检查一个字段值是否为null,而后一种方法不会按照你的期望工作,因为null是一种特殊的值,它不等于任何东西,所以你不能使用等号=进行相等比较。

因此,当您需要检查一个字段值是否为null时,请使用:

where x is null

使用以下代替:

where x = null

4

我认为平等是可以被绝对确定的。 null 的问题在于它本质上是未知的。将 null 与任何其他值组合在一起都会得到 null - 未知。即使输入是 null,每次询问 SQL “我的值是否等于 null?” 都将得到未知的答案。我认为实现 IS NULL 可以让这一点更加清晰。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接