0Pricing
SQL Academy · 课时

IS NULL 与 IS NOT NULL

正确检查缺失值

IS NULL 与 IS NOT NULL 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

检查缺失值

由于与 NULL 的比较始终返回未知,SQL 提供了两个专用运算符来检查缺失值:IS NULL 和 IS NOT NULL。

它们是查找或排除 NULL 的唯一可靠方式。在本课中,您将学习如何正确使用它们。

-- Rows where phone is missing
SELECT name FROM customers WHERE phone IS NULL;

-- Rows where phone is present
SELECT name FROM customers WHERE phone IS NOT NULL;

为何 = NULL 无效

您可能会想写成 WHERE phone = NULL,但它永远匹配不到任何内容。该条件对每一行的结果都是 unknown,而 WHERE 只保留真行。

结果是一个空集 — 这是一个隐蔽的错误,因为不会抛出任何错误。

-- Always returns 0 rows, even if NULLs exist
SELECT * FROM customers WHERE phone = NULL;

-- The fix
SELECT * FROM customers WHERE phone IS NULL;

IS NULL 的实际应用

IS NULL 仅当值缺失时返回 true,否则返回 false。它永远不会返回 unknown。

因此,在任何需要明确真值或假值结果的地方使用它都很安全。

SELECT id, name, (phone IS NULL) AS missing_phone
FROM customers;

-- id | name  | missing_phone
-- ---+-------+--------------
--  1 | Alice | f
--  2 | Bob   | t
--  3 | Carol | t

IS NOT NULL 的实际应用

IS NOT NULL 恰好相反:值存在时返回 true,值缺失时返回 false。

请使用它筛选出确实有数据的行,例如筛选出可以联系的客户。

SELECT name, phone
FROM customers
WHERE phone IS NOT NULL;

-- name  | phone
-- ------+----------
-- Alice | 555-0101

与 AND / OR 组合

您可以使用 AND 和 OR 将 NULL 检查与其他条件组合起来。

例如,查找仍然需要填写电话号码的活跃客户 — 这是一个常见的数据质量查询。

SELECT id, name
FROM customers
WHERE is_active = true
  AND phone IS NULL;

-- Active customers missing a phone number

NULL 出现在 NOT IN 中:一个陷阱

当列表包含 NULL 时,NOT IN 的行为会出现问题。如果集合中有任何值是 NULL,NOT IN 可能会对每一行都返回 unknown,从而丢弃您原本预期的结果。

请优先使用 NOT EXISTS,或者先从子查询中筛除 NULL。

-- Risky: if blocked_ids contains a NULL, this returns nothing
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked);

-- Safer
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked WHERE user_id IS NOT NULL);

IS DISTINCT FROM

PostgreSQL 提供了 IS DISTINCT FROM 和 IS NOT DISTINCT FROM — 这两种运算符都能安全处理 NULL。

与 = 不同,它们会将两个 NULL 视为相等,将 NULL 与某个值视为不同,并且始终返回 true 或 false,从不返回 unknown。

SELECT
  NULL IS NOT DISTINCT FROM NULL AS a, -- true: both NULL = same
  NULL IS DISTINCT FROM 5        AS b, -- true: NULL differs from 5
  5 IS DISTINCT FROM 5          AS c; -- false: same value

比较两个可为 NULL 的列

比较两个可能同时为 NULL 的列时,普通的 = 无法处理二者同时为 NULL 的情况。IS NOT DISTINCT FROM 可以清晰地处理这种情况。

即使值未知,它也非常适合查找尚未发生变化的行。

-- Rows where old and new phone are 'the same',
-- counting NULL = NULL as same
SELECT id
FROM customer_changes
WHERE old_phone IS NOT DISTINCT FROM new_phone;

统计 NULL 值

IS NULL 的一个实际用途是审查数据质量 — 统计有多少行缺少某个值。

将它与 FILTER(PostgreSQL)结合使用,或者在 COUNT 中使用 CASE,即可并列统计 NULL 值和非 NULL 值。

SELECT
  count(*) AS total,
  count(*) FILTER (WHERE phone IS NULL)     AS missing,
  count(*) FILTER (WHERE phone IS NOT NULL) AS present
FROM customers;

在 CHECK 约束中检查 NULL

您可以在 CHECK 约束中使用 NULL 检查来强制执行这样的规则:“如果一行已发货,就必须有发货日期”。

请注意:CHECK 约束在其条件为 true 或 unknown 时都会通过,因此务必仔细考虑 NULL 的情况。

CREATE TABLE orders (
  id        integer PRIMARY KEY,
  status    text NOT NULL,
  ship_date date,
  CHECK (status <> 'shipped' OR ship_date IS NOT NULL)
);

最佳实践

请养成以下习惯,以安全处理 NULL:

  • 始终使用 IS NULL / IS NOT NULL 检查,绝不要使用 = NULL。
  • 警惕可为空的子查询与 NOT IN 结合使用的情况。
  • 使用 IS DISTINCT FROM 进行对 NULL 安全的相等比较。
  • 使用 count(*) FILTER (...) 审查缺失数据。
-- The reliable toolkit
WHERE col IS NULL
WHERE col IS NOT NULL
WHERE a IS DISTINCT FROM b
WHERE a IS NOT DISTINCT FROM b

快速检查

您希望找出所有 phone 列没有值的客户。哪个 WHERE 子句是正确的?

回顾

您学会了使用 IS NULL 和 IS NOT NULL 正确检查缺失值,也了解了为什么 = NULL 永远不起作用。

您还了解了 NOT IN 陷阱、可安全处理 NULL 的 IS DISTINCT FROM 运算符,以及如何使用 FILTER 审查 NULL 值。接下来,您将学习如何使用 COALESCE 和 NULLIF,用合理的默认值替换 NULL。

SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;

常见问题解答

「IS NULL 与 IS NOT NULL」课时是免费的吗?

是的 — 「IS NULL 与 IS NOT NULL」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「IS NULL 与 IS NOT NULL」这节课中我会学到什么?

正确检查缺失值 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「IS NULL 与 IS NOT NULL」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

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