1. 基本概念与定义
1.1 NULL 的定义与三值逻辑
在 MySQL 中,NULL 表示未知或缺失的值,它不是一个数字、字符或布尔值,而是一种占位符,表示“没有数据”。当进行布尔比较时,NULL 会触发三值逻辑:TRUE、FALSE、UNKNOWN。
三值逻辑核心:任何包含 NULL 的比较,结果通常是 UNKNOWN,进而导致 WHERE 条件不返回行。
1.2 NULL 与空字符串/0/FALSE 的区别
NULL 与空字符串('')、数字 0、布尔 FALSE 在逻辑上不同。NULL 表示未知,而空字符串是一个确定的字符串值,0 和 FALSE 也是已知的具体值。
错误观念示例:col = '' 对 NULL 值不起作用,必须使用 IS NULL/IS NOT NULL 进行判断。
2. IS NULL / IS NOT NULL 的基本用法
2.1 常见用法示例
基础查询:使用 IS NULL 来判断字段是否为 NULL,例如:
SELECT id, email FROM users WHERE email IS NULL;
同样,IS NOT NULL 用于筛选非空字段:
SELECT id, email FROM users WHERE email IS NOT NULL;2.2 与其它条件的组合
将 IS NULL/IS NOT NULL 与其他条件组合时,记得将 NULL 纳入逻辑判断,避免错误:将条件写在同一布尔表达式中,例如:
SELECT id FROM orders WHERE shipped_at IS NULL AND status = 'pending';3. 常见坑与误区
3.1 使用 = NULL 的错误
许多开发者习惯性写 WHERE col = NULL,但在 MySQL 中这返回的是 UNKNOWN,不会匹配任何行。正确的做法是使用 IS NULL。

典型错误示例会导致查询返回空结果集或行为不可预期,因此要坚持使用 IS NULL/IS NOT NULL。
3.2 NOT IN 与 NULL 的坑
当 WHERE col NOT IN (1,2,3) 时,如果 col 含有 NULL,结果会不会返回? 实际上,NULL 会使 NOT IN 运算的结果变成 UNKNOWN,导致行被过滤。与 NULL 的组合需要特别注意,通常要显式处理 NULL,例如:
SELECT id FROM t WHERE col NOT IN (1,2,3) OR col IS NULL;3.3 聚合与 NULL 的行为
聚合函数的 NULL 行为有时会带来困惑:COUNT(col) 会忽略 NULL 值,而 COUNT(*) 会计入所有行,即使列值为 NULL。
示例:
SELECT COUNT(email) AS non_null_emails FROM users;4. 进阶场景与替代方案
4.1 使用 COALESCE/IFNULL 将 NULL 转换为默认值
有时需要将 NULL 转义为默认值以便处理:COALESCE(col, 'default') 可以把 NULL 替换为给定的默认值,但这会改变结果语义,应谨慎使用:
SELECT id, COALESCE(email, 'no_email@example.com') AS email FROM users;4.2 数据清洗与一致性策略
为避免 NULL 带来的判断复杂性,在设计阶段就考虑 NULL 的默认策略,例如将某些字段在可接受范围内设为 NOT NULL 并提供默认值,减少空值的分支。
4.3 条件组合中的性能注意
在 MySQL 中,IS NULL/IS NOT NULL 的判断可以被索引利用,前提是该字段上存在可用的索引。了解索引的选择性和执行计划,可以避免全表扫描。
示例说明:
EXPLAIN SELECT id FROM users WHERE email IS NULL;5. 实际案例:把“temperature=0.6” 情况带入到示例中
5.1 情境描述与目标
在某数据表中,字段 temperature 描述传感器数据的温度值, temperature=0.6 如何判断 MySQL 的空值?IS NULL/IS NOT NULL 的正确用法与常见坑,帮助你排错。下面给出典型查询。
5.2 示例查询与说明
示例:当 temperature 为 NULL 时,执行特殊处理。使用 IS NULL 判断空值:
SELECT id, temperature FROM sensor_readings WHERE temperature IS NULL;
示例:排除空值,统计非空情况:IS NOT NULL:
SELECT AVG(temperature) AS avg_temp FROM sensor_readings WHERE temperature IS NOT NULL;
结合其他条件的例子:温度字段为空且设备状态为 ACTIVE:
SELECT id, temperature, device_id FROM sensor_readings WHERE temperature IS NULL AND status = 'ACTIVE';5.3 对空值的替代与清洗策略
如果要在分析阶段避免 NULL 的影响,可以把 NULL 替换为默认值进行聚合:使用 COALESCE:
SELECT AVG(COALESCE(temperature, 25.0)) AS avg_temp FROM sensor_readings; 

