MySQL NULL值

介绍

NULL 在 MySQL 中表示 缺失的值 或 未知的值 ,它不是一个具体的值(如 0、空字符串 '' 或 'NULL'),而是一种状态。其核心特性包括:

  • NULL 不等于任何值,包括自身(NULL = NULL 的结果是 NULL,而非 TRUE)。

  • NULL 参与的算术运算结果仍为 NULL(如 10 + NULL = NULL)。

  • 聚合函数(如 COUNT()、SUM())会自动忽略 NULL 值(COUNT(*) 除外)。

NULL 与空字符串的区别

NULL 是“无值”,'' 是“有值但为空”,两者不等价。

  SELECT * FROM users WHERE email = ''; -- 匹配空字符串,不匹配 NULL
  SELECT * FROM users WHERE email IS NULL; -- 匹配 NULL,不匹配空字符串

NULL 的判断与比较

详见链接:https://www.malaoshi.top/show_1IXXR9qMp4E.html

NULL 在聚合函数中

  • COUNT(column):统计非 NULL 的记录数;COUNT(*):统计所有记录数(包括 NULL)。

  • SUM(column)、AVG(column):忽略 NULL 值,仅计算非 NULL 数据。

示例

-- 假设 users 表有 3 条记录:age 为 20、NULL、25
SELECT COUNT(age) FROM users; -- 结果:2(忽略 NULL)
SELECT COUNT(*) FROM users;   -- 结果:3(包含所有记录)
SELECT AVG(age) FROM users;   -- 结果:22.5((20+25)/2)

NULL 在索引中的存储

  • 普通索引(INDEX):允许存储 NULL 值,IS NULL/IS NOT NULL 可使用索引。
  • 主键索引(PRIMARY KEY):不允许 NULL 值(主键字段必须非空)。
  • 唯一索引(UNIQUE):允许多个 NULL 值(因为 NULL 不视为相等)。

示例:

-- 唯一索引允许多个 NULL
CREATE UNIQUE INDEX idx_email ON users(email);
INSERT INTO users(email) VALUES (NULL), (NULL); -- 可执行,无冲突

NULL 的默认值与约束

  • 字段未指定 NOT NULL 时,默认允许 NULL;指定 NOT NULL 则必须赋值。
  • DEFAULT NULL:显式指定字段默认值为 NULL(默认行为)。

示例:

-- 创建表时指定 NOT NULL 约束
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL, -- 不允许 NULL
    email VARCHAR(50) DEFAULT NULL -- 允许 NULL(默认)
);

排序中的 NULL

升序(ASC)时 NULL 排在最前,降序(DESC)时排在最后。

SELECT * FROM users ORDER BY age ASC; -- NULL 在前
SELECT * FROM users ORDER BY age DESC; -- NULL 在后
  • 条件判断中的 NULL:WHERE 子句中 NULL 相关条件结果为 UNKNOWN,不会返回记录。

NULL 的处理函数

https://www.malaoshi.top/show_1IXlTQ9mVLZ.html

总结

  • 本质:NULL 是“未知/缺失值”,非具体数值,需用 IS NULL/IS NOT NULL 判断。
  • 比较规则:普通运算符(=、> 等)对 NULL 无效,需用 <=> 或专用语法。
  • 聚合与索引:聚合函数忽略 NULL,普通索引存储 NULL,主键不允许 NULL。
  • 最佳实践:避免不必要的 NULL,关键字段(如主键、外键)设为 NOT NULL;处理 NULL 时使用 IFNULL/COALESCE 函数。

原文出处:/show_1GW2ICBt2HJt.html