前言
在一次 MySQL 的线上查询操作中,因为
!=的特性导致未能正确查询到为NULL的数据,险些引发严重后果。本文将详细解析NULL在 SQL 中的行为,如何避免类似问题,并提供实际操作建议。
1. 为什么NULL会查询不到?
 
在 SQL 中,NULL 的处理方式与其他值不同:
- NULL与任何值的比较(如- NULL != '张三'或- NULL <> '张三')的结果是- UNKNOWN,而不是- TRUE或- FALSE。
- SQL 查询只会返回结果为 TRUE的记录,因此NULL会被忽略。
- NULL的行为类似于“无法确定”,既不等于任何值,也不不等于任何值。
1.1 示例
SELECT * FROM table_name WHERE name != '张三';
行为分析:
- name = NULL的记录:- NULL != '张三'的结果为- UNKNOWN,被忽略。
- name = '张三'的记录:- '张三' != '张三'的结果为- FALSE,被忽略。
- 其他值的记录:如 name = '李四',结果为TRUE,被选中。
2. 测试案例:验证NULL行为
 
为了验证上述逻辑,以下通过创建测试数据表进行演示。
2.1 创建数据表
CREATE TABLE example_table (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255)
);INSERT INTO example_table (name) VALUES
('Alice'),   -- 非空字符串
(''),        -- 空字符串
(NULL),      -- NULL
('Bob');     -- 非空字符串
查看数据表内容:

2.2 查询目标:找出NULL值
 
2.2.1 测试1:= NULL
 
SELECT * FROM example_table WHERE name = NULL;
结果:未查询到任何数据。

原因:NULL = NULL 的结果为 UNKNOWN,因此不会被选中。
2.2.2 测试2:!= ''
 
SELECT * FROM example_table WHERE name != '';
-- 或者
SELECT * FROM example_table WHERE name <> '';
-- 或者
SELECT * FROM example_table WHERE name NOT IN('');
结果:NULL 记录未被查询到。

原因:NULL != '' 的结果为 UNKNOWN,因此被忽略。
2.2.3 测试3:IS NULL
 
SELECT * FROM example_table WHERE name IS NULL;
结果:正确查询到 NULL 数据。

原因:IS NULL 是专门用于检查 NULL 值的操作符。
3. 正确查询包含NULL的数据
 
针对上述问题,可以采用以下解决方案:
3.1 解决方案1:避免字段允许NULL
 
在表结构设计时,设置字段默认值为 ''(空字符串),从源头避免 NULL 值的产生。
3.2 解决方案2:在查询时添加 IS NULL 条件
 
SELECT * FROM example_table WHERE name != '' OR name IS NULL;
3.3 解决方案3:使用函数替换 NULL 值
 
3.3.1 方法1:IFNULL()
 
SELECT * FROM example_table WHERE IFNULL(name, '') != '';
- 解释:IFNULL()用于将NULL替换为指定值(如'')。
3.3.2 方法2:COALESCE()
 
SELECT * FROM example_table WHERE COALESCE(name, '') != '';
- 解释:COALESCE()返回第一个非NULL值。
4. 总结
- 在 SQL 中,=和!=无法正确处理NULL,需要特殊处理。
- 查询 NULL数据时,应使用IS NULL或相关函数。
- 从设计角度,尽量避免字段允许 NULL,以减少逻辑复杂性和潜在风险。
“如果此文章对您有帮助💪,帮我点个赞👍,感激不尽🤝!”