在 SQL 中处理 NULL 值需要理解它们在比较、计算和数据操作中的行为。NULL 代表缺失或未定义的数据,其行为与典型值不同。例如,使用 WHERE column = NULL
将不起作用,因为 NULL 不等于任何值,包括它自身。相反,使用 IS NULL
或 IS NOT NULL
来检查 NULL 值。类似地,像 SUM()
或 AVG()
这样的聚合函数默认忽略 NULL 值,如果不加以考虑,可能会导致意外结果。要将 NULL 值替换为默认值,可以使用 COALESCE()
(标准 SQL)或 ISNULL()
(SQL Server)等函数。例如,SELECT COALESCE(salary, 0) FROM employees
将 NULL 工资替换为 0,确保总计或平均值等计算包含所有行。
在使用联接(join)或约束(constraint)时,NULL 值可能会引入微妙的问题。例如,外键列中含有 NULL 的行不会与任何主键匹配,即使主键表中存在 NULL。类似地,在 UNIQUE
约束中使用 NULL 允许存在多个 NULL 值,因为在这种上下文中 NULL 被视为与其它 NULL 不同。为了加强数据完整性,如果数据必须始终存在,则在创建表时将列定义为 NOT NULL
。例如,CREATE TABLE users (id INT PRIMARY KEY, email VARCHAR(255) NOT NULL)
确保每个用户都有一个电子邮件。在查询时,避免在条件逻辑中混合使用 NULL 值和非 NULL 值。例如,WHERE (column = 5 OR column IS NULL)
确保两种情况都被明确涵盖。
NULL 值也会影响性能和索引。某些数据库不索引 NULL 值,因此过滤 IS NULL
的查询可能会执行全表扫描。为了优化,如果经常查询 NULL 值,可以考虑使用计算列或包含 NULL 的部分索引。例如,在 PostgreSQL 中,CREATE INDEX idx_missing_data ON orders (order_id) WHERE shipped_date IS NULL
为未发货的订单创建索引。务必在你的模式(schema)中记录 NULL 值的处理方式,以避免混淆。测试边缘情况,例如 GROUP BY
中的 NULL
(所有 NULL 值会分到一组)或 ORDER BY
中的 NULL
(根据数据库不同,可能排在最前或最后),以确保行为一致。通过预测这些情况,你可以设计出能够可预测地处理 NULL 值的查询和模式。