在数据库管理与开发中,NULL 是一个特殊且重要的概念,它表示“未知”、“缺失”或“不适用”的值,与空字符串 、数字 0 或布尔值 false 等有本质区别,正确判断和处理 NULL 是保证数据查询准确性和业务逻辑完整性的关键,本文将详细探讨数据库中 NULL 的判断方法、注意事项及最佳实践。
NULL 的核心概念与特殊性
NULL 是 SQL 标准中用来表示数据缺失或未知状态的标记,它不等于任何值,包括其自身。NULL = NULL 的结果既不是 true 也不是 false,而是 NULL,这种特性使得直接使用比较运算符(如 、)判断 NULL 会失效,因此数据库提供了专门的运算符和函数来处理 NULL 值。
判断 NULL 的核心方法:IS NULL 与 IS NOT NULL
在 SQL 中,判断字段值是否为 NULL 必须使用 IS NULL 或 IS NOT NULL 运算符,而非传统的比较运算符,以下是具体用法及示例:
IS NULL:判断值是否为 NULL
当需要查询字段值为 NULL 的记录时,使用 IS NULL,查询用户表中“手机号”字段为 NULL 的用户:
SELECT user_id, username FROM users WHERE phone_number IS NULL;
IS NOT NULL:判断值是否非 NULL
当需要查询字段值不为 NULL 的记录时,使用 IS NOT NULL,查询所有已填写邮箱的用户:

SELECT user_id, email FROM users WHERE email IS NOT NULL;
注意事项:
IS NULL和IS NOT NULL不能与其他比较运算符(如 、>)混用。WHERE column = NULL是错误的写法,结果不会返回任何数据。- 不同数据库(如 MySQL、PostgreSQL、SQL Server、Oracle)对
IS NULL的支持一致,但需注意某些数据库在配置下可能对NULL的比较有特殊行为(如 MySQL 的NULL排序规则)。
NULL 在逻辑运算中的处理:COALESCE 与 IFNULL/ISNULL
在查询或计算中,若需将 NULL 替换为默认值,可使用 COALESCE 函数(标准 SQL)或数据库特定的函数(如 MySQL 的 IFNULL、SQL Server 的 ISNULL)。
COALESCE:返回第一个非 NULL 值
COALESCE(value1, value2, ...) 按顺序返回参数中第一个非 NULL 的值,若所有参数均为 NULL,则返回 NULL,查询用户信息,若“手机号”为 NULL,则显示“未知”:
SELECT user_id, COALESCE(phone_number, '未知') AS phone FROM users;
数据库特定函数
- MySQL:
IFNULL(expr1, expr2),若expr1为NULL,则返回expr2,否则返回expr1。
示例:SELECT IFNULL(phone_number, '未知') FROM users; - SQL Server:
ISNULL(check_expression, replacement_value),功能与IFNULL类似。
示例:SELECT ISNULL(phone_number, '未知') FROM users; - PostgreSQL:使用
COALESCE或NULLIF(用于返回NULL,如NULLIF(expr1, expr2)当expr1=expr2时返回NULL)。
NULL 在聚合函数与条件判断中的表现
聚合函数忽略 NULL 值
大多数聚合函数(如 COUNT()、SUM()、AVG()、MAX()、MIN())会自动忽略 NULL 值。

COUNT(*):统计所有行(包括NULL行)。COUNT(column):仅统计column非NULL的行数。SUM(column):计算column非NULL值的总和,若所有值为NULL,则返回NULL。
示例:统计用户表中已填写手机号的数量:
SELECT COUNT(phone_number) AS phone_count FROM users;
CASE WHEN 中的 NULL 判断
在 CASE WHEN 语句中,需使用 IS NULL 判断条件,根据用户年龄分组,NULL 视为“未知”:
SELECT
CASE
WHEN age IS NULL THEN '未知'
WHEN age < 18 THEN '未成年'
ELSE '成年'
END AS age_group,
COUNT(*) AS user_count
FROM users
GROUP BY age_group;
NULL 与索引、性能的注意事项
NULL 与索引
- 大部分数据库允许在索引列中存储
NULL值(如 MySQL 的 InnoDB 索引会包含NULL值,但 B-Tree 索引对NULL的处理可能导致索引失效)。 - 若查询条件为
column IS NULL,数据库可能使用索引;但若column上有NOT NULL约束,则IS NULL查询可直接排除该列,优化性能。
避免 NULL 过多影响性能
- 表设计中,若某列经常为
NULL,可考虑使用默认值(如0、)替代NULL,减少NULL带来的计算和存储开销。 - 对频繁查询
NULL的列,可单独建立索引(如CREATE INDEX idx_null ON table(column)),但需权衡索引维护成本。
NULL 在不同数据库中的特殊行为
虽然 IS NULL 是标准语法,但部分数据库对 NULL 的处理存在差异:
| 数据库 | 特殊行为示例 |
|---|---|
| MySQL | 使用 比较时,NULL = NULL 结果为 NULL;<=> 运算符可安全比较 NULL(如 NULL <=> NULL 返回 true)。 |
| PostgreSQL | 支持 IS DISTINCT FROM 和 IS NOT DISTINCT FROM,用于区分 NULL 和普通值(如 NULL IS NOT DISTINCT FROM NULL 返回 true)。 |
| Oracle | 默认情况下,NULL 排序优先级最高(升序时排在最后),可通过 NULLS FIRST/LAST 子句调整。 |
最佳实践总结
- 始终使用
IS NULL/IS NOT NULL:避免用 或 判断NULL,确保查询逻辑正确。 - 合理使用
COALESCE:在查询中替换NULL为默认值,避免计算或显示错误。 - 表设计时谨慎使用
NULL:非必要列设置NOT NULL约束,减少NULL带来的不确定性。 - 注意聚合函数的
NULL处理:明确COUNT(*)与COUNT(column)的区别,避免统计偏差。 - 测试
NULL场景:业务逻辑中需覆盖NULL情况(如用户未填写信息时的数据处理)。
相关问答 FAQs
问题1:为什么 NULL = NULL 在 SQL 中返回 NULL 而不是 true?
解答:NULL 表示“未知值”,因此无法确定两个未知值是否相等,若 NULL 表示“用户未填写手机号”,则两个未填写手机号的用户是否相等无法判断,故结果为 NULL,需使用 IS NULL 或 IS NOT DISTINCT FROM(PostgreSQL)等专门语法处理。

问题2:如何查询某列同时包含 NULL 和特定值的记录?
解答:使用 OR 条件组合 IS NULL 和普通比较,查询“手机号”为 NULL 或为 138 开头的用户:
SELECT * FROM users WHERE phone_number IS NULL OR phone_number LIKE '138%';
注意:若条件复杂,建议使用 COALESCE 将 NULL 替换为默认值后再比较(如 WHERE COALESCE(phone_number, '') LIKE '138%'),但需确保默认值不影响业务逻辑。
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/244708.html