5.1 缺乏意义

SQL 语言和 Java 语言一样,有一个特殊的关键字来表示值的缺失——它是 null。或者正如它经常写的那样 - NULL

SQL 中的用法NULL与 Java 中 null 的用法非常相似。在 Java 中,可能存在其字段包含空值的对象。在 SQL 中,可能存在其行包含 NULL 值的表。

让我特意在我们的产品表中添加一些无品牌产品。如果产品的品牌未知,则该值为NULL

要显示此类产品,让我们按id倒序对我们的产品表进行排序,并取 10 条记录。该请求将如下所示:

SELECT * FROM product
ORDER BY id DESC
LIMIT 10

我们得到如下查询结果:

ID 姓名 品牌 价格 数数
15 铆钉 无效的 0.01 1000
14 拧紧 无效的 0.10 1000
13 站立 宜家 100.00 10
12 花盆 聪明花 99.00 9
十一 扶手椅 博世 44.00 8个
10 盘子 博世 199.00 10
9 梳妆台 宜家 99.00 10
8个 LG 15.00 100
7 电视 LG 350.00 4个
6个 架子 博世 25.00 114

是的,我在桌子上加了铆钉和螺丝。他们有价格和数量,但没有品牌。

5.2 与 NULL 的比较

你还记得你以前在 Java 中使用 null 时会很生气吗?您不能通过 equals() 比较可以引用空值的变量。例子:

Product product1 = new Product();
Product product2 = null;
if (product2.equals(product1) {  //an exception will be raised here}

您可能不会相信,但在 SQL 语言中,您也在等待处理 NULL 值时的细微差别。听起来像这样:什么都不是 NULL.

如果您尝试过滤掉品牌为的所有产品null

SELECT * FROM product
WHERE brand = NULL

你会得到一个空表:

ID 姓名 品牌 价格 数数

但是,如果您在查询中写入brand不等于NULL,您将得到相同的结果:

SELECT * FROM product
WHERE brand != NULL

你会再次得到一个空表:

ID 姓名 品牌 价格 数数

与 NULL 的任何比较/操作都将返回 NULL:

表达 结果
品牌 = NULL 无效的
品牌 != NULL 无效的
空 = 空 无效的
空!= 空 无效的

是的,即使你将 NULL 与 NULL 进行比较,那么答案也将是 NULL.

5.3 IS NULL 和 IS NOT NULL

那么我们如何检查某些字段(或某些列)的值为NULL?为此,SQL 有一个特殊的表达式 - IS NULL。看起来像这样。

variable IS NULL

如果你想检查你的表的列是否不等于NULL,那么你需要写IS NOT NULL

variable IS NOT NULL

让我们编写一个查询,从产品表中选择品牌等于 的所有产品NULL。这样的请求看起来像这样:

SELECT * FROM product
WHERE brand IS NULL

我们得到以下查询结果:

ID 姓名 品牌 价格 数数
14 拧紧 无效的 0.10 1000
15 铆钉 无效的 0.01 1000

现在让我们显示所有价格低于 20 美元的产品:

SELECT * FROM product
WHERE price  < 20

我们得到以下查询结果:

ID 姓名 品牌 价格 数数
2个 椅子 宜家 5.00 45
8个 LG 15.00 100
14 拧紧 无效的 0.10 1000
15 铆钉 无效的 0.01 1000

现在我们指定价格必须低于 $20 而品牌不是NULL

SELECT * FROM product
WHERE price  < 20 AND brand IS NOT NULL

我们得到如下查询结果:

ID 姓名 品牌 价格 数数
2个 椅子 宜家 5.00 45
8个 LG 15.00 100

太好了,最后两行不见了。这是它的工作原理。有点不寻常,但这其中还是有一定的逻辑的。