编程SQL 开发人员

解释一下 SQL 中是如何处理 NULL 的。意外的 NULL 值有何危险,如何正确处理它们,以及常见的错误是什么?

用 Hintsage AI 助手通过面试

答案。

在 SQL 中,NULL 值表示 "未知" 或 "缺失" 的值。它的行为是特殊的:

  • 通过 =<> 与任何值比较 NULL 总是会得到 UNKNOWN 的结果,而不是 TRUEFALSE
  • 检查 NULL 需要使用 IS NULLIS 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 后丢弃了这些行,导致部分数据丢失。