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 | tIS 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 numberNULL 出现在 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 反馈 — 无需本地设置。
此课程中的所有课时
- NULL 的真正含义
- IS NULL 与 IS NOT NULL
- COALESCE 与 NULLIF
- 聚合和连接中的 NULL