null有哪些常见的含义?(如何正确理解SQL中的NULL)

/ 0评 / 0

SELECT * FROM SOME_TABLEWHERE SOME_COLUMN IS NULL

或者这样写:

复制代码

WHERE SOME_COLUMN = 1

正确的写法应该是第二种(其中某些列为空)。

为什么要这样写?

在比较数据库数据时,我们不会使用关键字“IS”,对吗?

例如,如果我们想知道一列的值是否等于1,那么WHERE语句是这样的:

复制代码

WHERE SOME_COLUMN = 1

那为什么NULL值使用IS关键字呢?为什么要这样处理NULL?

因为,在SQL中,NULL表示“未知”。也就是说,空值代表“未知”值。

空等于未知

在大多数数据库中,空字符串和空字符串是有区别的。

然而,并不是所有的数据库都是这样的。例如,甲骨文不支持空字符串,它会自动将空字符串转换为空值。

在大多数其他数据库中,空值和字符串的处理方式不同:

空字符串意味着“没有值”,这是已知的。

NULL表示“未知值”,未知。

这就像问一个问题:“美国总统罗斯福的中间名是什么”?

有些人可能会回答:“我不知道罗斯福总统的中间名。”。在这种情况下,可以在数据库中使用MIDDLE_NAME列来表示罗斯福的中间名,该列的值为NULL。

有些人可能会回答:“罗斯福总统没有中间名。他的父母没有给他起中名,所以我知道罗斯福总统真的没有中名。在这种情况下,MIDDLE_NAME列应该是一个空字符串。

甲骨文比百特更特别。两个值都用空值表示,而大多数其他数据库的处理方式不同。

但是只要记住NULL代表一个未知值,那么在编写SQL查询语句的时候就会得心应手。

例如,如果您有这样的查询语句:

复制代码

SELECT * FROM SOME_TABLEWHERE 1 = 1

此查询将返回所有行(假设SOME_TABLE不是空表),因为表达式“1=1”必须为真。

如果我这样写:

复制代码

SELECT * FROM SOME_TABLEWHERE 1 = 0

表达式“1=0”为假,此查询语句不会返回任何数据。

但是如果我这样写:

复制(原创www.isoyu.com版权)代码

SELECT * FROM SOME_TABLEWHERE 1 =&n百思特网bsp;NULL

此时,数据库不知道这两个值(1和NULL)是否相等,因此不会返回任何数据。

三进制逻辑

在SQL查询语句中,WHERE通常有三种结果:

可以是真的(此时会返回数据);

可以为假(此时不返回数据);

也可以为空或未知(此时不会返回数据)。

你可能会想,“既然这样,我为什么要关心它是假的还是空的?他们不都返回数据吗?”

接下来我来告诉你什么情况下会出现问题:我们来看看NOT()。

假设有这样一个查询语句:

复制代码

SELECT * FROM SOME_TABLEWHERE NOT(1 = 1)

数据库首先计算1=1,这显然是正确的。

然后,数据库将应用NOT()条件,因此WHERE返回false。

因此,上述查询不会返回任何数据。

但是如果你这样改变陈述:

复制代码

SELECT * FROM SOME_TABLEWHERE NOT(1 = 0)

数据库将首先计算1=0,这一定是假的。

然后,数据库应用NOT () Baxter网络条件,从而得到相反的结果并成为真。

因此,该语句将返回数据。

但是如果你把句子改成这样呢?

复制代码

SELECT * FROM SOME_TABLEWHERE NOT(1 = NULL)

数据库首先计算1 =空。它不知道1是否等于NULL,因为它不知道NULL的值是什么。

因此,这个计算不会返回真或假,它将返回一个空值。

接下来,NOT()继续解析前一次计算返回的结果。

当NOT()遇到NULL时,它将生成另一个NULL。未知的对立面是另一个未知。

所以,对于这两个查询:

复制代码

SELECT * FROM SOME_TABLEWHERE NOT(1 = NULL)

复制代码

SELECT * FROM SOME_TABLEWHERE 1 = NULL

不会返回数据,即使它们正好相反。

空和不在

如果我有这样一个查询语句:

复制代码

SELECT * FROM SOME_TABLEWHERE 1 IN (1, 2, 3, 4, NULL)

显然,WHERE返回true,并且该语句将返回数据,因为括号列表中存在1。

但是如果你这样写:

复制代码

SELECT * FROM SOME_TABLEWHERE 1 NOT IN (1, 2, 3, 4, NULL)

显然,WHERE返回false,这个查询不会返回数据,因为括号列表中存在1,但我们说的是“NOT IN”。

但是如果我们把句子改成这样呢?

复制代码

SELECT * FROM SOME_TABLEWHERE 5 NOT IN (1, 2, 3, 4, NULL)

这里的WHRE不会返回数据,因为它的结果不是真的。括号列表中可能不存在数字5,也可能因为其中有空值而存在(数据库不知道空值是什么)。

这个WHERE将返回空值,因此整个查询不会返回任何数据。

希望大家现在都知道如何处理SQL语句中的NULL值了。