SQL 中的 NULL
(从 SQL 中的 NULL 翻译而来)
SQL中NULL的概念是什么? 有什么需要注意的吗? 这篇文章就是想把这个问题说清楚。
查询某列值为NULL的数据
当要查询列值为NULL的数据时,下面两个哪个更好?
* 从
哪里 = 空
仍然
* 从
哪里为空
答案是,第二个更好。
为什么? 为什么不在其他比较中使用 IS? 例如,如果您想知道某个字段值是否等于 1,可以使用简单的 WHERE 子句:
其中 = 1
那么为什么要用IS来区别对待NULL呢?
因为:在SQL中,NULL的意思是“”,意思是“未知”,不知道,不明白,未知! (原来的:)
NULL 是“未知”
在大多数数据库中,NULL 和空字符串之间是有区别的。
但也有例外。 例如,在 中,值根本不允许为空字符串,并且 中 的所有空字符串都会自动转换为 NULL。
然而,对于大多数其他数据库,NULL 和空字符串的处理方式有所不同: - 空字符串也是一个值,但它是空的。 - NULL 是“未知”值。 (换句话说,是“未知”,没有“值”的概念)
例如,这就像问:美国总统西奥多·罗斯福的中间名是什么? - 一个答案可能是:我不知道西奥多·罗斯福的中间名是什么。 (在这种情况下,“中间名”字段应该为 NULL) - 另一个答案可能是:西奥多·罗斯福没有中间名。 他的父母没有给他起中间名。 我知道的事实是西奥多·罗斯福没有中间名。 (在这种情况下,“中间名”应该是一个空字符串)
牢记 NULL 是“未知”的概念,您可以轻松处理使用 NULL 时可能遇到的一些麻烦。
例如,下面的WHERE子句将得到true,并且可以找到数据(如果数据库有数据):
* 从
其中 1 = 1
以下子句将变为 false,并且永远找不到数据:
* 从
其中 1 = 0
下面的 WHERE 子句将得到 NULL,因为数据库不知道 1 和 NULL 之间的关系(“未知”)。 它们相等但不相等,数据库不知道,因此 WHERE 子句将得到 NULL(“未知”)。 所以下面的查询永远不会返回任何数据。
* 从
WHERE 1 = NULL 三元逻辑(原文为Logic)
SQL语句中的WHERE子句有三种不同的结果 - true(将返回数据) - false(不会返回数据) - NULL(“未知”不会返回数据)
好吧,既然 false 和 NULL 都不会返回数据,那我们为什么要注意它们的区别呢?
遇到NOT()的时候就有问题了。
例如,下面的语句中,1必须等于1。显然,NOT()之后就会变成假,然后数据就永远不会返回。
* 从
哪里不是(1 = 1)
至于下面这句话,显然NOT()会得到true,当然也会返回数据。
* 从
哪里不是(1 = 0)
但这句话又如何呢?
* 从
哪里不是(1 = NULL)
上面这句话1=NULL是因为数据库不知道NULL是什么,“未知”,所以结果是NULL。 至于NOT(),它不知道NULL是什么以及如何处理它,所以它也会返回NULL,所以WHERE子句得到NULL,既不是真也不是假而是NULL,所以上面的语句Data永远不会回。
好吧,看看下面两个说法。 虽然条件相反,但结果是一样的:不会查询到任何数据。
* 从
哪里不是(1 = NULL)
* 从
其中 1 = IN 且 NULL
NOT IN 也值得注意。
例如,在下面的SQL中,1显然在下面的列表中,WHERE将变为true,并且将查询数据。
* 从
其中 1 IN (1, 2, 3, 4, NULL)
再看看下面的句子。 显然数组里有1,那么NOT IN就会得到假,然后就无法查询到数据了。
* 从
其中 1 不在 (1, 2, 3, 4, NULL)
再看看这个:
* 从
WHERE 5 NOT IN (1, 2, 3, 4, NULL)
先来说说答案:这条语句不能查询数据。
5 是否在下面的列表中? 数据库不知道,因为里面有NULL。 谁知道 5 等不等于 NULL(“未知”)? 我不知道,所以 5 NOT IN (1, 2, 3, 4, NULL) 返回 NULL,所以查询没有可用数据。
概括
上面,NULL就是NULL,也就是“未知”。 已经介绍了这样一个概念的重要性。 理解这一点在构建复杂的 SQL 时会很有用。