MySQL中的NULL是一个特殊的标记,用来表示某个字段的值不存在、未知或者缺失,它不属于任何数据类型,也不等同于空字符串、数字0或者false。理解NULL值的特性对于正确编写数据库查询逻辑、避免数据运算错误非常重要。

NULL值的本质特性
NULL在MySQL中不是一个具体的值,而是表示字段没有存储有效数据。和普通的数值、字符串不同,NULL不参与常规的比较运算,也不能用等于号(=)来判断某个字段是否为NULL。比如用户表的邮箱字段,如果用户没有填写邮箱,这个字段的值就是NULL,而不是空字符串''。
NULL与其他常见空值的区别
很多用户容易混淆NULL和空字符串、0的差异,三者的核心区别如下:
| 对比项 | NULL | 空字符串'' | 数字0 |
|---|---|---|---|
| 含义 | 值不存在、未知 | 存在值为空字符串 | 存在值为数字0 |
| 数据类型 | 无所属类型 | 字符串类型 | 数值类型 |
| 参与运算结果 | 任何运算结果都为NULL | 字符串拼接等运算正常执行 | 正常参与数值运算 |
| 判断方式 | 用IS NULL/IS NOT NULL | 用= ''判断 | 用= 0判断 |
NULL值的常见使用规则
1. NULL值的判断
因为NULL不等于任何值,包括它自己,所以不能用= NULL或者!= NULL来判断字段是否为NULL,必须使用IS NULL或者IS NOT NULL。示例如下:
-- 查询邮箱为NULL的用户 SELECT * FROM user WHERE email IS NULL; -- 查询邮箱不为NULL的用户 SELECT * FROM user WHERE email IS NOT NULL;
2. NULL值参与运算的规则
任何包含NULL的算术运算、比较运算、逻辑运算结果都为NULL,比如NULL + 1的结果是NULL,NULL > 0的结果也是NULL。如果需要在运算中把NULL替换为指定值,可以使用IFNULL()函数,语法为IFNULL(字段名, 默认值)。示例如下:
-- 如果score字段为NULL,替换为0,再计算加10的结果 SELECT IFNULL(score, 0) + 10 AS final_score FROM student;
3. 排序时NULL的位置
在MySQL中,对包含NULL的字段排序时,默认情况下NULL值会排在所有非NULL值的前面(升序排序时),如果希望NULL值排在后面,可以用IS NULL条件调整排序逻辑:
-- 升序排序,NULL值排在最后 SELECT * FROM product ORDER BY price IS NULL, price ASC;
使用NULL值的注意事项
- 如果字段允许存储NULL,在插入数据时没有给该字段赋值,MySQL会自动将其设为NULL,除非字段设置了默认值。
- 唯一索引对NULL值的处理是:多个NULL值不会违反唯一约束,因为NULL不等于NULL,所以唯一索引字段可以存储多个NULL。
- 在统计行数时,
COUNT(字段名)会忽略NULL值,只统计非NULL的行数,而COUNT(*)会统计所有行数,包括NULL值的行。
正确区分NULL值的特性,才能在数据库设计和查询时避免逻辑漏洞,比如判断用户是否填写了手机号时,不能用phone = '',而要先判断phone IS NOT NULL再判断是否为空字符串,这样才能覆盖所有场景。