数据库中允许null值具体意味着什么?
- 内容介绍
- 文章标签
- 相关推荐
什么是 NULL?按理说,
在关系型数据库中。NULL 并不是一个普通的数值,也不是空字符串或 0。它是一种特殊的标记,表示该列的值缺失、未知或不适用。因为它不等于任何其他值,所以在比较时必须使用专门的运算符。
NULL 与空字符串、0 的区别
• 空字符串是一个已知的、长度为 0 的字符数据。
• 数字 0 是一个确定的数值。
• NULL 则表示“没有值”。说起来,col = ''col = 0 与 col IS NULL 完全不同。不过,
为什么需要允许 NULL?
痛点一:数据来源不完整
在实际业务中,经常会出现某些信息暂时不可得。例如使用者的
痛点二:业务规则多变
因为业务演进,字段的必填性可能会改变。使用 NULL 可以让表结构保持向后兼容,而无需频繁修改约束。
痛点三:统计与分析需求
在做聚合统计时需要区分“真的为 0”与“根本没有记录”。NULL 能帮助分析师识别缺失数据,从而做出更准确的决策。
常见误区与痛点解析
-
误用!= 或 <> 比较 NULL:
WHERE col!老实说,= 1会把包含null的行过滤掉。因为任何与null的比较结果都是null。这常导致“查询结果少了几条记录却找不到原因”。 -
Cascade 计算意外产生 NULL:
在算术表达式中,只要有一个操作数是
null。 整个表达式结果也为null. 这会让求和、平均等聚合函数返回意外的null,影响报表展示。 -
索引性能下降:
包含大量
null的列建立普通索引时查询 optimizer 可能无法利用索引,从而导致扫描全表。 -
Lack of explicit constraint:
者往往忘记在文档里说明哪些列可以为
null。导致后续维护人员误以为必须填充,有额外的数据清洗工作。
正确处理 NULL 的查询技巧
a) 判断是否为 NULL / NOT NULL
SELECT * FROM employees WHERE age IS NULL;-- 找出年龄未知的员工
SELECT * FROM employees WHERE salary IS NOT NULL;-- 排除薪资为空的记录
b) 替换默认值 – COALESCE / IFNULL / NVL
SELECT name,COALESCE AS age_display -- 若 age 为 null 则显示 -1
FROM employees;SELECT name,NVL AS salary_display
FROM employees;
b) 在聚合函数中排除 NULL
SELECT G AS avg_salary -- 自动忽略 null FROM employees;SELECT G) AS avg_salary_including_zero FROM employees;不过,
插入 NULL 与默认值示例
CREATE TABLE employees ( id INT PRIMARY KEY。name VARCHAR NOT NULL,age INT NULL,salary DECIMAL DEFAULT NULL );INSERT INTO employees VALUES;INSERT INTO employees VALUES;
索引、约束与性能注意事项
- B‑Tree 索引对大量 null 的列效果有限:`IS NULL` 查询通常走全表扫描;如果经常需要查找空值,可以考虑创建`partial index`/`filtered index`或`bitmap index`来提高性能。
- Cascade 删除/更新时 Null 不受约束影响:`FOREIGN KEY ... ON DELETE SET NULL` 可用于保留子表记录但将关联外键置为空,避免级联删除带来的数据丢失风险。
- `UNIQUE`约束与 Null 的交互:`UNIQUE` 列允许多个 `null`,如果业务要求只能出现一次请改用复合唯一约束或添加检查触发器。
- `CHECK`约束结合 `IS NOT NULL` 实现强制非空:`CHECK ` 等价于 `NOT NULL`,但可配合更复杂逻辑一起使用。
设计建议 & 常用方法
-
- 检查非空: ALL ` 等安全写法。
NULL 为数据库带来的价值与挑战
什么是 NULL?按理说,
在关系型数据库中。NULL 并不是一个普通的数值,也不是空字符串或 0。它是一种特殊的标记,表示该列的值缺失、未知或不适用。因为它不等于任何其他值,所以在比较时必须使用专门的运算符。
NULL 与空字符串、0 的区别
• 空字符串是一个已知的、长度为 0 的字符数据。
• 数字 0 是一个确定的数值。
• NULL 则表示“没有值”。说起来,col = ''col = 0 与 col IS NULL 完全不同。不过,
为什么需要允许 NULL?
痛点一:数据来源不完整
在实际业务中,经常会出现某些信息暂时不可得。例如使用者的
痛点二:业务规则多变
因为业务演进,字段的必填性可能会改变。使用 NULL 可以让表结构保持向后兼容,而无需频繁修改约束。
痛点三:统计与分析需求
在做聚合统计时需要区分“真的为 0”与“根本没有记录”。NULL 能帮助分析师识别缺失数据,从而做出更准确的决策。
常见误区与痛点解析
-
误用!= 或 <> 比较 NULL:
WHERE col!老实说,= 1会把包含null的行过滤掉。因为任何与null的比较结果都是null。这常导致“查询结果少了几条记录却找不到原因”。 -
Cascade 计算意外产生 NULL:
在算术表达式中,只要有一个操作数是
null。 整个表达式结果也为null. 这会让求和、平均等聚合函数返回意外的null,影响报表展示。 -
索引性能下降:
包含大量
null的列建立普通索引时查询 optimizer 可能无法利用索引,从而导致扫描全表。 -
Lack of explicit constraint:
者往往忘记在文档里说明哪些列可以为
null。导致后续维护人员误以为必须填充,有额外的数据清洗工作。
正确处理 NULL 的查询技巧
a) 判断是否为 NULL / NOT NULL
SELECT * FROM employees WHERE age IS NULL;-- 找出年龄未知的员工
SELECT * FROM employees WHERE salary IS NOT NULL;-- 排除薪资为空的记录
b) 替换默认值 – COALESCE / IFNULL / NVL
SELECT name,COALESCE AS age_display -- 若 age 为 null 则显示 -1
FROM employees;SELECT name,NVL AS salary_display
FROM employees;
b) 在聚合函数中排除 NULL
SELECT G AS avg_salary -- 自动忽略 null FROM employees;SELECT G) AS avg_salary_including_zero FROM employees;不过,
插入 NULL 与默认值示例
CREATE TABLE employees ( id INT PRIMARY KEY。name VARCHAR NOT NULL,age INT NULL,salary DECIMAL DEFAULT NULL );INSERT INTO employees VALUES;INSERT INTO employees VALUES;
索引、约束与性能注意事项
- B‑Tree 索引对大量 null 的列效果有限:`IS NULL` 查询通常走全表扫描;如果经常需要查找空值,可以考虑创建`partial index`/`filtered index`或`bitmap index`来提高性能。
- Cascade 删除/更新时 Null 不受约束影响:`FOREIGN KEY ... ON DELETE SET NULL` 可用于保留子表记录但将关联外键置为空,避免级联删除带来的数据丢失风险。
- `UNIQUE`约束与 Null 的交互:`UNIQUE` 列允许多个 `null`,如果业务要求只能出现一次请改用复合唯一约束或添加检查触发器。
- `CHECK`约束结合 `IS NOT NULL` 实现强制非空:`CHECK ` 等价于 `NOT NULL`,但可配合更复杂逻辑一起使用。
设计建议 & 常用方法
-
- 检查非空: ALL ` 等安全写法。

