null是表示“缺失”或“未知”的特殊状态标记,非0、空字符串或false;判断须用is null/is not null;运算和比较结果为null;聚合函数count(col)忽略null,但count(*)统计所有行。

MySQL 中的 NULL 表示“缺失”或“未知”的值,它不是 0、空字符串('')、空格,也不是布尔假(FALSE),而是一种特殊的**状态标记**,用来说明这个字段当前没有有效数据,其真实值不可知。
NULL 的本质是“未知”,不是“空”
比如用户注册时没填手机号,数据库里存 NULL,意思是“我们不知道他有没有手机号”;而如果存了空字符串 '',则暗示“我们知道他提供了信息,但内容为空”。这种语义差异直接影响业务逻辑判断和统计准确性。
- NULL ≠ NULL:两个 NULL 比较结果仍是 NULL(三值逻辑中的 UNKNOWN)
- NULL 参与任何运算(如 +、-、*、=、)都会让整个表达式结果为 NULL
- 主键、唯一索引列默认不允许 NULL(除非显式声明允许)
怎么正确判断 NULL?只能用 IS NULL / IS NOT NULL
不能写 WHERE phone = NULL 或 WHERE phone != NULL —— 这类写法永远不返回数据,因为比较结果恒为 UNKNOWN,被 WHERE 当作 false 处理。
- 查空手机号:
SELECT * FROM users WHERE phone IS NULL - 查已填手机号:
SELECT * FROM users WHERE phone IS NOT NULL - 错误示范:
WHERE age = NULL→ 无结果;WHERE age 18若 age 是 NULL,该行也不会被选中
如何安全处理 NULL?常用函数有 IFNULL 和 COALESCE
避免 NULL 波及计算或展示,推荐在查询层做兜底:
-
IFNULL(phone, '未提供'):仅支持两个参数,简洁常用 -
COALESCE(phone, mobile, backup_phone, '全部缺失'):按顺序取第一个非 NULL 值,更灵活 - 聚合函数如 COUNT(col) 自动忽略 NULL;但 COUNT(*) 统计所有行,含 NULL 行
建表时就要想清楚:哪些字段该允许 NULL?
设计阶段就应明确字段语义:
- 必填字段(如 user_id、created_at)必须加
NOT NULL - 可选字段(如 remark、avatar_url)可设
DEFAULT NULL(显式优于隐式) - 避免用空字符串或 0 代替 NULL 来“假装有值”,否则会混淆业务含义
- 索引列允许 NULL 时,该索引项仍可被使用(InnoDB 支持对 NULL 建 B+Tree 索引)










