现在是时候详细聊聊 NULL 了。这可不是无聊的闲聊,虽然我们的主角看起来……啥都没有。如果把表比作房子,NULL 就像里面的幽灵——安静、神秘、让人摸不着头脑。它好像在,但你问它啥它都不说,计算时也不参与,比较时还总是躲着。这不仅仅是“空”——而是 “啥都不知道”。
在 SQL 世界里,NULL 不是 0,不是空字符串,也不是我们平时说的“没有数据”。它是个特殊的未知标记,用的时候得小心点。今天我们就来搞清楚为啥 NULL 不是个奇怪的客人,而是数据库里很重要的角色。它其实就是 “值未知或者没定义”。
NULL 和空字符串或者数字 0 有啥区别?
很多刚学 SQL 的小伙伴会把 NULL 和别的值搞混,比如空字符串 '' 或者数字 0。咱们来看看它们的关键区别:
| 概念 | 含义 |
|---|---|
NULL |
完全没有值。这不是空盒子,是连盒子都没有 |
| 空字符串 | 就是没有任何字符的字符串。比如:'' |
数字 0 |
表示具体的数字,等于零 |
举个生活中的例子:假如你有个员工表,存着他们的工资。如果工资是 0,那就是这人一分钱没拿。如果工资是 NULL,那你根本不知道他拿多少(或者还没定下来)。
怎么理解 NULL
现在我们大概知道 NULL 是啥了,来看看 SQL 里怎么和它打交道。最重要的一句话就是:NULL 既不等于任何东西,也不不等于任何东西,甚至不等于自己。
SELECT NULL = NULL; -- 结果:FALSE
是不是有点懵?为啥这样?因为 NULL 就是未知。如果你有两个未知的值,你没法说它们相等,也没法说它们不相等。
咱们再看几个例子:
NULL 操作的例子
SELECT NULL + 1; -- 结果:NULL
SELECT NULL * 100; -- 结果:NULL
SELECT NULL = 0; -- 结果:FALSE
SELECT NULL <> 0; -- 结果:FALSE
NULL 参与加法、乘法或者别的计算时,结果永远是 NULL。这里 NULL 跟数学里的 0 完全不一样。就像你往虚空里扔点啥,这虚空啥都能吞掉。
实用例子
假设有个 students 表,存着学生的信息:
| id | name | birth_date | grade |
|---|---|---|---|
| 1 | Alice | 2000-01-01 | 85 |
| 2 | Bob | NULL | 90 |
| 3 | Charlie | 1999-05-22 | NULL |
| 4 | Diana | NULL | NULL |
例子 1:NULL 在条件里的影响
如果你想找所有没有出生日期的学生,写 WHERE birth_date = NULL:
SELECT *
FROM students
WHERE birth_date = NULL;
你啥都查不到,因为 NULL = NULL 返回 FALSE。要判断是不是 NULL,得用 IS NULL:
SELECT * FROM students WHERE birth_date IS NULL;
结果:
| id | name | birth_date | grade |
|---|---|---|---|
| 2 | Bob | NULL | 90 |
| 4 | Diana | NULL | NULL |
例子 2:NULL 在计算里的影响
| id | name | birth_date | grade |
|---|---|---|---|
| 1 | Alice | 2000-01-01 | 85 |
| 2 | Bob | NULL | 90 |
| 3 | Charlie | 1999-05-22 | NULL |
| 4 | Diana | NULL | NULL |
如果你想算所有学生的平均分:
SELECT AVG(grade) FROM students;
结果是:87.5。为啥?因为 NULL 在聚合函数里(比如 AVG、SUM、MIN、MAX)会被忽略。但要注意!如果你想把 NULL 的行也算进去,那就得多做点操作了。
后面几节课我们会更详细地学怎么和 NULL 打交道。
GO TO FULL VERSION