0Pricing
SQL Academy · 课时

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   | NULL

NULL 不等于零

一个常见错误是把 NULL 当作数字 0。二者完全不同。

  • 0 是一个已知值:零。
  • NULL 表示该值缺失或未知。

如果账户余额是 0,说明客户没有余额。如果是 NULL,则表示我们目前还不知道余额。

SELECT id, balance
FROM accounts;

-- id | balance
-- ---+--------
--  1 | 0        <- known: empty wallet
--  2 | NULL     <- unknown: not recorded yet

NULL 不等于空字符串

对于文本列,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;      -- unknown

NULL = 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 Alice

NULL 会在算术运算中传播

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. NULL 的真正含义
  2. IS NULL 与 IS NOT NULL
  3. COALESCE 与 NULLIF
  4. 聚合和连接中的 NULL
← 返回 SQL Academy