数据库里空值到底咋表示,NULL那些事儿简单聊聊
- 问答
- 2025-12-25 02:53:13
- 1
开门见山,在数据库里,当一个字段“没有值”、“不确定”或者“不适用”时,就用一个叫 NULL 的东西来表示,你可以把它想象成数据库世界里的一个特殊标记,专门用来占个位置,告诉大家:“注意啦,这里没东西,是空的!” 这跟我们平时在表格里填“无”或者画个斜杠是完全不同的概念。
NULL不是零,也不是空字符串
这是最容易搞混的一点,也是理解NULL的关键,咱们来打个比方:
- 零(0):就像你问“你钱包里有多少钱?”,我回答“0元”,这是一个非常明确的信息,我知道我钱包里一分钱都没有。
- 空字符串(‘’):就像你问“你的英文名是什么?”,我回答“我没有英文名”,这也是一个明确的信息,我知道我确实没取英文名。
- NULL:就像你问“你女朋友的生日是哪天?”,而我是一条单身狗,这个问题对我而言是“不适用”的,因为我根本没有女朋友,或者,你问我“那家新开的餐厅人均消费多少?”,我没去过,不知道”,再或者,你在表格的“中间名”一栏,对于很多没有中间名习惯的人来说,这一栏就是“没有信息”。
NULL代表的是一种“未知”或“缺失”的状态,它不是任何一个具体的值,你把NULL当作0或者空字符串去计算,结果会变得很奇怪。
NULL在计算中会“传染”
因为NULL代表“未知”,所以任何涉及NULL的计算,结果也必然是“未知”的,这就像一道数学题,如果其中有一个数字你不知道是多少,那整个题目的答案你肯定也算不出来,数据库也是这么处理的。
你有一个员工表,里面有个叫“奖金”的字段,有些人有奖金(比如1000),有些人的奖金还没定(是NULL),现在你想计算所有人的总收入(工资+奖金)。
- 对于奖金是1000的员工:工资 + 1000 = 一个明确的数字。
- 对于奖金是NULL的员工:工资 + NULL = NULL(因为加上一个“未知”的数,结果还是“未知”)。
最后算总和的时候,那个奖金为NULL的员工,他的总收入也会显示为NULL,而不是他的基本工资,这有时候会让人很头疼,需要特别处理。
查询数据时,找NULL要用特殊方法

平时我们找数据,会用 (等号)。WHERE 奖金 = 1000,就能找出所有奖金是1000的人,但如果你想找出“奖金是空值”的人,用 WHERE 奖金 = NULL 是行不通的。
为什么呢?还是那个道理,NULL是“未知”,两个“未知”的东西能划等号吗?数据库说:我不知道它们相不相等,所以不能返回“真”,判断一个字段是不是NULL,必须用专门的运算符:IS NULL 和 IS NOT NULL。
- 正确的写法是:
WHERE 奖金 IS NULL(找出所有没发奖金的人) - 或者:
WHERE 奖金 IS NOT NULL(找出所有奖金有具体数额的人)
NULL在排序和统计里的“脾气”
当你让数据库按某个字段排序时,NULL值的位置也很有意思,在不同的数据库系统里,规定不太一样,但通常NULL会被视为“比任何值都小”或者“比任何值都大”,比如在MySQL里,默认情况下,升序排列时,NULL会排在最前面,你可以通过命令改变这个规则,但你需要知道它有这个脾气。
在统计计数时,也要小心,用 COUNT(*) 会统计所有行的数量,包括NULL值所在的行,但如果你用 COUNT(某个字段名),COUNT(奖金),数据库就会忽略这个字段是NULL的那些行,只统计有具体值的行数,如果你不小心,就可能得到不一样的统计结果。

到底该不该用NULL?这是个问题
关于在设计数据库表的时候,要不要允许字段为NULL,一直有争论。
- 支持用NULL的一派认为:NULL完美地表达了“信息缺失”的真实世界情况,客户的第二联系电话,很多情况下就是没有的,用NULL很合适,如果硬要塞一个空字符串或者0,反而失去了“缺失”的本意。
- 反对用NULL的一派认为:NULL太麻烦了,它在计算和查询上的“怪异”行为很容易导致程序出bug,他们主张所有字段都设置为“非空”,然后给那些可能缺失的信息设一个默认值,比如用空字符串代替NULL,用-1或者0代替数字型的NULL,这样逻辑更简单。
这没有绝对的对错,关键是要根据实际情况来定,如果一个信息是“可选”的,比如备注、中间名,允许为NULL很合理,但如果一个信息是业务上至关重要的,比如订单金额、用户名,那就应该坚决地设置为“非空”,从源头上避免NULL带来的不确定性。
总结一下
NULL是数据库里一个非常有用的工具,但它更像是一把双刃剑,它正确地描述了现实世界中信息缺失的状态,但同时也给数据操作带来了一些复杂性,理解它的核心——“NULL代表未知”——就能理解它所有的行为:为什么它不等于任何值(包括它自己),为什么计算会被“传染”,为什么查询要用 IS NULL,在使用时,心里绷紧这根弦,就能避免很多潜在的坑,简单聊下来,NULL的那些事儿,其实就是和“未知”与“不确定”打交道的事儿。
(参考资料:这个概念主要基于关系型数据库的基础理论,在诸如SQL-92标准等数据库规范中有明确定义,并在几乎所有数据库教程和书籍中,如《SQL必知必会》等,都有重点章节进行讨论。)
本文由太叔访天于2025-12-25发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/67915.html
