NULL 的真正含义
表示未知,而不是零,也不是空值
NULL 的真正含义 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
认识 NULL
NULL 是 SQL 中表示“我不知道”的方式。它不是零,不是空字符串,也不是 false — 它表示没有值。
每当某列没有已知值时,数据库就会在该处存储 NULL。了解 NULL 的行为,是编写正确查询最重要的步骤之一。
-- A customers table where some phone numbers are unknown
SELECT id, name, phone
FROM customers;
-- id | name | phone
-- ---+---------+------------
-- 1 | Alice | 555-0101
-- 2 | Bob | NULL <- phone unknown
-- 3 | Carol | NULLNULL 不等于零
一个常见错误是把 NULL 当作数字 0。二者完全不同。
0是一个已知值:零。NULL表示该值缺失或未知。
如果账户余额是 0,说明客户没有余额。如果是 NULL,则表示我们目前还不知道余额。
SELECT id, balance
FROM accounts;
-- id | balance
-- ---+--------
-- 1 | 0 <- known: empty wallet
-- 2 | NULL <- unknown: not recorded yetNULL 不等于空字符串
对于文本列,NULL 和空字符串 '' 也不相同。
''是长度为零的字符串,是一个已知且存在的值。NULL表示根本没有提供字符串。
您可以有意存储一条空备注,也可以完全不填写备注。SQL 能够区分这两种情况。
SELECT id, note, length(note) AS note_len
FROM tickets;
-- id | note | note_len
-- ---+------+----------
-- 1 | '' | 0 <- empty but present
-- 2 | NULL | NULL <- absent; length is also unknown三值逻辑
常规逻辑有两个结果:true 和 false。SQL 增加了第三个结果:未知。
任何涉及 NULL 的比较都会得到 unknown,因为您无法与一个不存在的值进行比较。这称为三值逻辑。
-- Each comparison with NULL returns UNKNOWN, not true/false
SELECT
NULL = 5 AS eq, -- unknown
NULL <> 5 AS neq, -- unknown
NULL = NULL AS self_eq, -- unknown (!)
NULL > 0 AS gt; -- unknownNULL = NULL 并不为真
最令人意外的规则是:NULL = NULL 并不是 true,其结果是 unknown。
为什么呢?如果两个值都是未知的,您无法断定它们相等 — 它们可能分别是任何值。要检查某个值是否为 NULL,必须使用 IS NULL,而不是 =。
-- Wrong: never returns rows, because NULL = NULL is unknown
SELECT * FROM customers WHERE phone = NULL;
-- Right: use IS NULL
SELECT * FROM customers WHERE phone IS NULL;WHERE 仅保留 TRUE 行
WHERE 子句只会保留条件为真的行。条件为 false 或 unknown 的行都会被丢弃。
这就是为什么使用 = 筛选 NULL 列时,会悄然移除您可能希望看到的行。
-- Bob and Carol have NULL phones, so phone = '555-0101'
-- is UNKNOWN for them and they are excluded.
SELECT name
FROM customers
WHERE phone = '555-0101';
-- Returns only AliceNULL 会在算术运算中传播
NULL 会在表达式中传播。几乎所有涉及 NULL 的算术或字符串运算都会产生 NULL。
如果您不知道某个输入值,也就无法知道结果。
SELECT
10 + NULL AS sum, -- NULL
100 * NULL AS prod, -- NULL
NULL / 2 AS div, -- NULL
'Hi ' || NULL AS greet; -- NULL (string concat)NULL 从何而来
NULL 常见于以下几种情况:
INSERT未提供允许为空的列。- 外连接的一侧没有匹配的行。
- 对零行进行聚合(例如,对空集合执行
SUM会返回NULL)。
了解 NULL 的来源,有助于您决定如何处理它们。
-- Omitting phone inserts NULL automatically
INSERT INTO customers (id, name) VALUES (4, 'Dan');
SELECT id, name, phone FROM customers WHERE id = 4;
-- 4 | Dan | NULL防止 NULL:NOT NULL
如果某列始终都应该有值,请将其声明为 NOT NULL。这样,数据库就会拒绝任何试图将该列留空的行。
这是保持数据整洁并避免日后出现 NULL 意外的有效方式。
CREATE TABLE users (
id integer PRIMARY KEY,
email text NOT NULL, -- must always be provided
bio text -- nullable: optional
);
-- This fails: email cannot be NULL
INSERT INTO users (id, bio) VALUES (1, 'hi');NULL 与 DISTINCT / GROUP BY
有一种情况例外:SQL 会将 NULL 视为相等,即分组和去重。
在 DISTINCT 和 GROUP BY 中,所有 NULL 值都会被归入同一个组,即使在其他情况下 NULL = NULL 的结果是未知。这种特殊处理让分组功能更加实用。
SELECT phone, count(*)
FROM customers
GROUP BY phone;
-- phone | count
-- ---------+------
-- 555-0101 | 1
-- NULL | 2 <- all NULLs grouped together思维模型回顾
每当看到 NULL 时,请牢记以下规则:
- NULL 表示未知,而不是零或空值。
- 与 NULL 比较会得到未知 — 请使用
IS NULL/IS NOT NULL。 WHERE只保留真行。- 涉及 NULL 的算术运算会得到 NULL。
- 分组会将 NULL 视为一个组。
-- The two correct NULL tests
SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;快速检查
在标准 SQL 中,表达式 NULL = NULL 的结果是什么?
回顾
现在您已经理解了 NULL 的真正含义:它是表示缺失或未知值的标记,与 0 和 '' 不同。
您了解了 SQL 的三值逻辑、为什么 = NULL 永远不起作用、NULL 如何在算术运算中传播,以及 WHERE 如何丢弃未知行。接下来,您将学习使用 IS NULL 和 IS NOT NULL 检查 NULL 的正确方法。
-- Remember the golden rule
SELECT * FROM customers WHERE phone IS NULL; -- correct
-- SELECT * FROM customers WHERE phone = NULL; -- always empty!常见问题解答
「NULL 的真正含义」课时是免费的吗?
是的 — 「NULL 的真正含义」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「NULL 的真正含义」这节课中我会学到什么?
表示未知,而不是零,也不是空值 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「NULL 的真正含义」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。