关系数据库将 NULL 值视为一种表示缺失、未知或不适用数据的方式。与空字符串或零值不同,NULL 明确表示值的缺失。例如,在存储员工记录的表中,"termination_date" 列中的 NULL 可能表示该员工仍在职,而空字符串则可能含义模糊。数据库有效地为 NULL 分配存储空间,通常使用位图标志来跟踪行中哪些列包含 NULL。这避免了为默认值保留空间,从而保持表紧凑,但在查询时需要特殊处理。
在执行涉及 NULL 值的操作时,关系数据库遵循特定规则。涉及 NULL 的算术表达式通常返回 NULL(例如,5 + NULL
结果为 NULL),逻辑比较如 WHERE column = NULL
将不会按预期工作。相反,开发人员必须使用 IS NULL
或 IS NOT NULL
来检查 NULL。默认情况下,聚合函数如 SUM()
或 AVG()
会忽略 NULL 值,但这可能导致意想不到的结果。例如,SUM(salary)
中包含一些 NULL 工资的记录将被排除在外,这实际上相当于将它们视为零。开发人员必须使用诸如 COALESCE()
或 IFNULL()
等函数在计算前将 NULL 替换为默认值。
NULL 也影响数据库约束和连接。外键列中的 NULL 是允许的,即使没有匹配的主键存在,因为 NULL 不违反参照完整性。唯一约束将 NULL 视为不同的值:唯一电子邮件列可以包含多个 NULL,因为它们不代表实际值。然而,涉及 NULL 的连接可能会产生意想不到的结果。例如,两个表基于包含 NULL 的列进行 INNER JOIN
时,将排除这些行,而 OUTER JOIN
则会保留它们。开发人员应在模式设计中明确处理 NULL,例如在适用时使用 NOT NULL
约束,以避免歧义并确保数据一致性。