介绍
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函数。