在 SQL 中,NULL 值表示 "未知" 或 "缺失" 的值。它的行为是特殊的:
= 或 <> 与任何值比较 NULL 总是会得到 UNKNOWN 的结果,而不是 TRUE 或 FALSE。NULL 需要使用 IS NULL 或 IS NOT NULL。NULL 进行的算术或逻辑操作都会返回 NULL。示例:
SELECT * FROM users WHERE name = NULL; -- 不会返回任何行 SELECT * FROM users WHERE name IS NULL; -- 正确 SELECT 1 + NULL; -- 结果:NULL
为了替换 NULL,可以使用类似 COALESCE(foo, 0) 的函数(取第一个非 NULL 值)或者 ISNULL(foo, 'default') 在 SQL Server 中。
问题: 在 some_column 为 NULL 的行中,条件 WHERE some_column <> 'value' 会返回什么结果?
答案:
在这些行中,条件不会执行:与 NULL 的比较会返回 UNKNOWN,而不是 TRUE。因此,包含 NULL 的行将不会被选中。
示例:
-- some_column | ... -- NULL | ... -- 'abc' | ... -- 'value' | ... SELECT * FROM table WHERE some_column <> 'value'; -- 含 NULL 的行不会被包含
故事
WHERE status <> 'closed' 错误地忽略了 status = NULL 的账户(例如,新申请)。结果,活跃账户的计算不正确——数量少了 15%。故事
COALESCE(user_name, '尊敬的客户') 忘记添加到邮件中。近千个客户没有收到名字的称呼,这被视为自动化错误。故事
在迁移数据库时,LEFT JOIN 返回的行数比预期的多。结果发现左表中有 NULL 字段;WHERE b.field = 'X' 的过滤条件在 JOIN 后丢弃了这些行,导致部分数据丢失。