Mysql 为什么在SQL中NULL可以';不匹配空值?

Mysql 为什么在SQL中NULL可以';不匹配空值?,mysql,sql,sql-server,oracle,null,Mysql,Sql,Sql Server,Oracle,Null,我不熟悉SQL概念,在研究NULL表达式时,我想知道为什么NULL不能与NULL匹配。有人能告诉我一个真实世界的例子来简化这个概念吗?NULL表示没有值。SQL的设计者认为,当被问及A(我们不知道它的值)和B(我们不知道它的值)是否相等时,答案必须是UNKNOWN——它们可能相等,也可能不相等。我们没有足够的信息来决定这两种方式 您可能需要仔细阅读—SQL中任何比较的可能结果都是TRUE、FALSE和UNKNOWN(mysql将UNKNOWN和NULL视为同义词。并非所有RDBMS都这样做)NU

我不熟悉SQL概念,在研究NULL表达式时,我想知道为什么NULL不能与NULL匹配。有人能告诉我一个真实世界的例子来简化这个概念吗?

NULL
表示没有值。SQL的设计者认为,当被问及
A
(我们不知道它的值)和
B
(我们不知道它的值)是否相等时,答案必须是
UNKNOWN
——它们可能相等,也可能不相等。我们没有足够的信息来决定这两种方式


您可能需要仔细阅读—SQL中任何比较的可能结果都是
TRUE
FALSE
UNKNOWN
(mysql将
UNKNOWN
NULL
视为同义词。并非所有RDBMS都这样做)

NULL
是一个未知值。因此,判断
NULL==NULL
没有什么意义。这就像问“这个未知值等于那个未知值吗”-没有线索


有关可能更好的解释,请参阅。

NULL表示字段中没有数据

可以使用IS NULL检查空值


规则:即使是NULL也不能等于NULL

非技术方面

如果你问两个女孩,她们多大了?也许你会听到他们拒绝回答你的问题, 两个女孩都给你零年龄,这并不意味着两人的年龄相似。 所以没有任何东西可以等于null

不能使用=表示NULL,而可以使用IS NULL

请按照

与任何其他值相比,
NULL
值永远都不是真的,即使是
NULL

检查我们是否可以使用

Is Null or Not Null operators ..


如果我错了,请更正。在SQL中,WHERE子句仅在表达式的结果等于TRUE时才包括该值。(这与“如果表达式的结果不是假的”不同)

SQL中任何一侧为NULL的二进制操作的计算结果都为NULL(将NULL视为unknown的同义词)

所以


将不返回任何行,因为在每种情况下,where类的计算结果为NULL(不是真的)

实际上NULL表示未知值,因此我们如何比较两个未知值。

如果需要在NULL确实等于NULL的情况下进行比较,可以使用一对具有特殊默认值的
合并
方法。最简单的示例是关于可为空的字符串列

coalesce(MiddleName,'')=coalesce(@MiddleName,'')
如果@MiddleName变量具有空值,并且MiddleName列也具有空值,则此比较返回true。当然,它也匹配空字符串。如果这是一个问题,您可以将特殊值更改为愚蠢的值,例如

coalesce(MiddleName,'<NULL_DEFAULT>')=coalesce(@MiddleName,'<NULL_DEFAULT>')
coalesce(MiddleName,”)=coalesce(@MiddleName,”)

<代码>为空?是的。有趣的是::)@PraveenKumar,你可以检查一些东西是否为空。但是不要比较,因为结果是uknown,类似于除以零。啊,谢谢你的解释!更糟糕的是,
“bla”!=NUL/<代码>是错误的,即使NULL来自另一列。@ JoeNorman Glad帮助您,但考虑阅读达米安和其他人的答案,他们列出了技术方面的内容。事实上,就在前一天,我在办公室问了一位女士类似的问题,她在生日那天拒绝回答p在我的脑海中它是有意义的:null是一种状态。。。没有价值。一个值不能等于一种存在状态。
coalesce(MiddleName,'')=coalesce(@MiddleName,'')
coalesce(MiddleName,'<NULL_DEFAULT>')=coalesce(@MiddleName,'<NULL_DEFAULT>')