在数据库中,NULL
表示“未知值”或“缺失值”,这在 SQLite 中也是一项非常重要且经常被误解的概念。理解 NULL 的行为,对于避免数据错误、逻辑陷阱、过滤失败等问题至关重要。
📌 本文由 www.52kanjuqing.com 整理,仅此一次引用。
📚 目录
- 什么是 NULL?它与 0、空字符串的区别
- SQLite 中 NULL 的基本行为
- NULL 在条件判断中的“第三种状态”
- 使用 IS NULL 和 IS NOT NULL 进行判断
- NULL 与聚合函数的关系
- COALESCE、IFNULL 等函数的用法
- NULL 值排序与比较
- 在 JOIN、GROUP BY、DISTINCT 中的影响
- 出站参考链接与站内推荐
- 参考资料
1. 什么是 NULL?它与 0、空字符串的区别
NULL ≠ 0 ≠ ”(空字符串)
值类型 | 说明 |
---|---|
NULL | 表示未知、不存在或未定义的值 |
0 | 数字型 0,代表一个明确的值 |
'' | 空字符串,是已知但为空的文本 |
举例:
SELECT NULL = 0; -- 返回 NULL
SELECT NULL = ''; -- 返回 NULL
SELECT NULL IS NULL; -- 返回 1(TRUE)
2. SQLite 中 NULL 的基本行为
SQLite 的 NULL 遵循 SQL 标准逻辑,在大多数表达式中 NULL 会传播。例如:
SELECT NULL + 5; -- 返回 NULL
SELECT 'text' || NULL; -- 返回 NULL
❗ 注意:任何涉及 NULL 的算术或字符串操作,默认都将结果设为 NULL。
3. NULL 在条件判断中的“第三种状态”
SQL 的布尔逻辑是三值逻辑:
- TRUE
- FALSE
- UNKNOWN(由 NULL 导致)
例如:
SELECT * FROM users WHERE age > 18;
-- NULL 值的 age 不会被选中,因为结果是 UNKNOWN
4. 使用 IS NULL 和 IS NOT NULL 进行判断
不能使用 =
来判断 NULL,只能用 IS NULL
或 IS NOT NULL
:
SELECT * FROM users WHERE age IS NULL;
SELECT * FROM users WHERE email IS NOT NULL;
✅ 这是处理缺失数据、审计异常、过滤非空字段的常用方法。
5. NULL 与聚合函数的关系
大多数聚合函数会自动忽略 NULL,除非明确统计它们:
SELECT COUNT(age) FROM users; -- 忽略 NULL
SELECT COUNT(*) FROM users; -- 包括所有记录
SELECT AVG(score) FROM exams; -- 忽略 NULL 分数
📌 若要统计 NULL 数量,可结合 IS NULL 使用:
SELECT COUNT(*) FROM users WHERE age IS NULL;
6. COALESCE、IFNULL 等函数的用法
用于将 NULL 转换为默认值:
SELECT COALESCE(nickname, '匿名用户') FROM users;
SELECT IFNULL(age, 0) FROM users;
函数 | 用法说明 |
---|---|
IFNULL(a, b) | 若 a 是 NULL,则返回 b |
COALESCE(a, b, c...) | 返回第一个非 NULL 的值 |
7. NULL 值排序与比较
在 SQLite 中:
- 默认排序时,NULL 会被放在 最前面(ASC)或最后面(DESC),具体依赖 SQLite 版本
- 可使用
ORDER BY ... IS NULL
控制顺序
SELECT * FROM users ORDER BY age IS NULL, age;
8. 在 JOIN、GROUP BY、DISTINCT 中的影响
JOIN 时:
如果连接键包含 NULL,将无法匹配到任何值:
SELECT * FROM A LEFT JOIN B ON A.key = B.key;
-- A.key 为 NULL 的行不会匹配到任何 B.key
GROUP BY 时:
NULL 会被当作一个独立的分组:
SELECT age, COUNT(*) FROM users GROUP BY age;
-- NULL 会单独计为一组
DISTINCT 时:
多个 NULL 会被视为相同值:
SELECT DISTINCT age FROM users;
-- 多个 NULL 只显示一次
9. 🔗 出站参考链接与站内推荐
官方文档与权威文章:
站内推荐阅读(www.52kanjuqing.com):
10. 📚 参考资料
- SQLite 官方文档:Data Types and NULL
https://www.sqlite.org/datatype3.html#nulls - Ben Forta. SQL in 10 Minutes, Sams Teach Yourself
- SQLAntipatterns – Bill Karwin
- Stack Overflow sqlite-null tag
✅ 下一篇将是 《SQLite 别名(Alias)的使用与最佳实践》。如你需要打包前几篇为一份完整教程(支持 Markdown、HTML、PDF),也可以告诉我,我会帮你生成合集。继续吗?
发表回复