(译自 NULL in SQL )
SQL里的空值究竟代表什么意思呢,使用时有哪些事项需要留意呢,本文的目的就是对此进行详细说明。
查询某列值为 NULL 的数据
在需要找出某个字段数据为空的情况,比较这两种方法哪个更优null是什么意思,应该怎么做呢?
* FROM
WHERE = NULL
还是
* FROM
WHERE IS NULL
答案是,第二种更好。
是什么原因呢,为什么其他对照都不采用 IS 这种方式呢,比如要查询某个数据项是否为1,只需一个基础的查询条件即可
WHERE = 1
所以到底为什么对 NULL 区别对待使用 IS 呢?
由于:在 SQL 语言里,空值代表「不确定性」,就是「不确定性」,不清楚,不明白,不确定!
NULL 是「未知」
在大多数数据库中,NULL 和空字符串是有区别的。
也有特例,例如在某个系统里,明确禁止任何字段填入空白文本,该系统会将所有空白文本内容直接置为无效数据。
然而在其余多数数据库系统中,零值与空白字符会被当作不同对待,
举个例子,就好像问:美国总统西奥多·罗斯福的中间名是什么?
要清楚 NULL 代表着不确定的状态,这样就能轻松应对使用它时遇到的各种问题。
例如这个查询条件会返回肯定结果,这样就能检索到记录(前提是数据库中存在相关内容):
* FROM
WHERE 1 = 1
下面的子句会得到 false,永远都查不到数据:
* FROM
WHERE 1 = 0
而接下来的查询条件会返回空值,由于系统无法明确 1 与空值(即不确定状态)之间的关联性,它们是否相等系统无从判断null是什么意思,因此查询条件最终呈现为空值(即不确定状态),导致整个查询无法获取任何结果。
* FROM
WHERE 1 = NULL
三元逻辑(原文为 Logic)
一个 SQL 语句中 WHERE 子句有三种不同的结果
既然 false 和 NULL 都不会输出任何信息,为何还要留意它们之间的不同呢?
当遇上 NOT() 的时候就有问题了。
比如,1 确实就是 1,一旦应用否定运算,结果就变为非真,因此将无法获取任何信息。
* FROM
WHERE NOT(1 = 1)
下面这个情况啊,NOT操作之后会产生肯定的结果,所以会有相应的数据输出。
* FROM
WHERE NOT(1 = 0)
但是这句呢?
* FROM
WHERE NOT(1 = NULL)
那个等式 1 等于空值,因为数据库系统无法识别空值,把它当作未知情况,因此最终计算结果还是空值。关于 NOT() 来讲,它同样不了解 NULL 是何物,也不清楚该如何应对,因此同样会输出 NULL,这样一来 WHERE 子句接收到的就是 NULL,既不能视为真,也无法看作假,就是 NULL,这样一来,先前那条语句就注定不会产生任何结果。
那么,接下来看这两个表述,它们虽然所提条件互为对立,但最终达成的效果相同:都不会检索到信息。
* FROM
WHERE NOT(1 = NULL)
* FROM
WHERE 1 = NULL
NOT IN 和 NULL
NOT IN 也是非常值得注意的。
例如这个 SQL 语句,1 明确位于后续的清单里,一旦应用 WHERE 条件,结果便会为真,从而能够检索到相关记录。
* FROM
WHERE 1 IN (1, 2, 3, 4, NULL)
另有一句,明显 1 位于该列表之内,那么 不属于 就会得到非真值,因此无法检索到信息。
* FROM
哪里不是一,二,三,四,空值
再看这个:
* FROM
五个不包含在数字一,二,三,四以及空值之中
先说答案:这句语句不能查询到数据。
5 是否存在于后续的清单里呢?数据库无法确定,由于其中包含一个 NULL 值,无人知晓 5 是否等于 NULL(即不确定状态),因此无法知晓,所以 5 NOT IN (1, 2, 3, 4, NULL) 的结果为 NULL留学之路,进而导致无法检索到相关数据。
小结
上述内容,NULL 就是 NULL,代表「不确定」,这种认知的必要性就此阐明。领会该点,在编制精密 SQL 时会很有帮助。