数据库NULL值

admin
admin 2022年12月10日
  • 在其它设备中阅读本文章

在 SQL 中,NULL 表示「未知」的意思,就是不知道,不了解。首先,NULL 不等于 0,也不是 ""(空字符串)。其次,NULL 也不是空值。空值,亦是一种值,表示此处确定为空。而 NULL 是一个更未知的状态。最后,NULL 甚至都不是一种值,它只是一个标记符号。此处的值不确定,所以用 NULL 作为占位符来标记一下而已。NULL 不是值,因此 NULL 与 NULL 是不相同的。在逻辑判断中,NULL=NULL 返回的判断结果不是 TRUE,而是 NULL。因为,未知和未知是无法进行比较的。

一、NULL 的传递

在 SQL 中,NULL 这个“未知”的状态,是可传递的。譬如,对 NULL 进行算术运算,结果都是 NULL。

SELECT 2 + NULL;
SELECT 2 - NULL;
SELECT 2 * NULL;
SELECT 2 / NULL;

值得注意的是,用 NULL 除以 0 时,许多数据库系统并不会返回 "data exception — division by zero" 的错误,而是返回 NULL。此外,NULL 还可以运用于字符串的连接中。将 NULL 和其他字符串相连接,其结果也是 NULL。

二、三值逻辑

二值逻辑。传统的真假逻辑,就是二值逻辑。对于一个给定的命题,它要么为真,要么为假,非真即假,非假即真。在二值逻辑中,逻辑运算的结果只有真和假,不存在任何中间态。非真即假,非好即坏,是理想中的世界,而现实世界要复杂得多。对于一个命题,它不仅有可能是真的,有可能是假的,还有可能是咱不知道的、判断不了的。那么,现在就有真、假、未知,三种结果,即三值逻辑。NULL 就是这个表示「未知」的标记符。对于一个命题来说,如果它非真,不意味着它一定为假,因为它也有可能是 NULL;如果它非假,也并意味着它一定成立,因为它也有可能是 NULL。TRUE/FALSE/NULL,三种逻辑运算结果,形成了三值逻辑体系。
对于不确定的对象,无法使用 = 进行比较(也无法用 >、<、!= 等符号进行比较),当 = 两边有 NULL 时,结果一律是 NULL。如果我们需要从数据库中筛选出含 / 不含 NULL 的数据,需要使用 IS NULL/IS NOT NULL。

SELECT * FROM uers WHERE name IS NULL;
SELECT * FROM uers WHERE name IS NOT NULL;

三、使用 NULL 注意点

1、COUNT 列数据丢失

当某列存在 NULL 值时,再使用 COUNT 查询该列,就会出现数据“丢失”问题,如下 SQL 所示

SELECT COUNT(name) FROM users;

如果指定列存在 NULL 值时,需要用 COUNT(*)进行数据统计,就可以把 NULL 列计算在内,否则统计结果不含 NULL 值。

2、SELECT 数据列丢失

如果某列存在 NULL 值时,如果执行非等于查询 (<>/!=) 会导致为 NULL 值的结果丢失

SELECT * FROM uers WHERE name!='lisi';

查询时如果 name 列有 NULL 值并不会出现在结果中,如果需要则把 NULL 值包含在结果中即可

SELECT * FROM uers WHERE name!='lisi' AND name IS NULL;

3、查询返回 NULL 值

如果某列存在 NULL 值时,可能会导致 SUM(column) 的返回结果为 NULL 而非 0,如果 SUM 查询的结果为 NULL 就可以能会导致程序执行时空指针异常

SELECT SUM(weight) FROM uers WHERE name!='lisi';

如果 WHERE 条件下命中零条结果,则会返回 NULL,使用 IFNULL 函数处理一下即可

SELECT IFNULL(SUM(weight),0) FROM uers WHERE name!='lisi';

4、IN/NOT IN“异常”

没法判断某一个值在不在 NULL,也没法判断 NULL 在不在某一个值中,所以此种情况下返回 NULL。
NULL IN <任意值>/NULL NOT IN <任意值>判断一律返回 NULL 值,以下语句都返回 NULL。

SELECT NULL IN (1);
SELECT NULL NOT IN (1);

<任意值> IN (NULL)/<任意值> NOT IN (NULL)判断也一律返回 NULL,以下语句都返回 NULL。

SELECT 1 IN (NULL);
SELECT 1 NOT IN (NULL);

特别的,参数列表里有 NULL 值时,如果根据其他的值没有确定结果,则也会返回 NULL。

SELECT 1 IN (2,NULL); /*NULL*/
SELECT 2 IN (2,NULL); /*true*/
SELECT 1 NOT IN (2,NULL); /*NULL*/
SELECT 2 NOT IN (2,NULL); /*false*/