第 7 课
常见 SQL 错误
避免意外交叉 JOIN、NULL 陷阱、错误时间窗口和不安全假设。
SQL 错误在文本上常常很小,但在生产行为上可能很大。一个缺失的 JOIN 条件、错误的时间边界或意外的 NULL,都可能改变报表、API 响应或迁移结果。
JOIN 条件缺失或过弱
如果 JOIN 条件缺失,数据库可能组合出远超预期的行。即使有 ON 子句,也要确认使用了正确键,并在多租户或账户隔离场景下包含必要边界。
NULL 比较
NULL 不等同于普通值。应使用 IS NULL 或 IS NOT NULL:
WHERE deleted_at IS NULL
不要期待 deleted_at = NULL 像普通比较一样工作。
模糊的时间窗口
时间过滤应明确包含和排除边界:
WHERE created_at >= '2026-01-01'
AND created_at < '2026-02-01'
这通常比试图包含一天或一个月的最后一秒更安全。
应用路径中的 SELECT star
SELECT * 适合探索,但不适合多数应用代码。它可能读取不必要字段,隐藏对表结构的依赖,也让代码评审更难。
关键结论
先格式化查询,再按子句阅读,重点检查那些小假设:JOIN 键、NULL 行为、时间范围和选择列。
SQL 格式化工具 可以帮助你在执行或评审前暴露这些小假设。