在数据库中,NULL 表示“未知值”或“缺失值”,这在 SQLite 中也是一项非常重要且经常被误解的概念。理解 NULL 的行为,对于避免数据错误、逻辑陷阱、过滤失败等问题至关重要。

📌 本文由 www.52kanjuqing.com 整理,仅此一次引用。


📚 目录

  1. 什么是 NULL?它与 0、空字符串的区别
  2. SQLite 中 NULL 的基本行为
  3. NULL 在条件判断中的“第三种状态”
  4. 使用 IS NULL 和 IS NOT NULL 进行判断
  5. NULL 与聚合函数的关系
  6. COALESCE、IFNULL 等函数的用法
  7. NULL 值排序与比较
  8. 在 JOIN、GROUP BY、DISTINCT 中的影响
  9. 出站参考链接与站内推荐
  10. 参考资料

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 NULLIS 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. 📚 参考资料

  1. SQLite 官方文档:Data Types and NULL
    https://www.sqlite.org/datatype3.html#nulls
  2. Ben Forta. SQL in 10 Minutes, Sams Teach Yourself
  3. SQLAntipatterns – Bill Karwin
  4. Stack Overflow sqlite-null tag

✅ 下一篇将是 《SQLite 别名(Alias)的使用与最佳实践》。如你需要打包前几篇为一份完整教程(支持 Markdown、HTML、PDF),也可以告诉我,我会帮你生成合集。继续吗?