你以为NULL只是空?殊不知这个小小的NULL值,竟能让你的数据库查询性能暴跌,甚至导致逻辑错误!
1 NULL的本质:数据库中的“未知”幽灵
在MySQL的世界里,NULL不是一个值,而是一个标记——表示缺失、未知或不适用的数据。这与空字符串、零或False有本质区别。
当我们创建表时,若未显式指定NOT NULL约束,列默认允许NULL值:
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT NULL, -- 显式允许NULL
email VARCHAR(100) -- 默认允许NULL
);
2 三值逻辑:NULL的思维陷阱
与布尔逻辑的真/假不同,MySQL中的逻辑运算遇到NULL时会产生三种可能结果:TRUE、FALSE或UNKNOWN。
SELECT 5 > NULL; -- 返回NULL
SELECT NULL = NULL; -- 返回NULL,不是TRUE!
SELECT NULL IS NULL; -- 返回TRUE,这才是正确检查方式
3 实战示例:NULL查询的坑与破解
错误方式:
SELECT * FROM users WHERE email = NULL; -- 永远返回空结果!
正确方式:
SELECT * FROM users WHERE email IS NULL;
检查非NULL值:
SELECT * FROM users WHERE email IS NOT NULL;
4 聚合函数与NULL的微妙关系
NULL值在聚合函数中通常被忽略,但COUNT(*)和COUNT(列)行为不同:
SELECT COUNT(*), COUNT(email) FROM users;
- COUNT(*) 统计所有行,包括NULL
- COUNT(email) 只统计非NULL值的行
5 函数救赎:处理NULL的实用工具
IFNULL()函数提供默认值:
SELECT name, IFNULL(email, '未填写') AS email_info FROM users;
COALESCE()函数返回第一个非NULL值:
SELECT COALESCE(NULL, NULL, '第三个值', '第四个值'); -- 返回'第三个值'
6 索引与NULL的性能考量
虽然MySQL允许在可为NULL的列上创建索引,但NULL值可能影响索引效率。建议:
- 对需要频繁查询的列,尽量避免NULL
- 可为NULL的列使用IS NULL条件时,索引可能失效
最佳实践:在设计表时,显式指定列的NULL属性,并为重要查询字段设置NOT NULL约束和默认值。
面对NULL这个看似简单实则复杂的“空值”,唯有理解其本质、掌握特性和处理技巧,才能写出稳健高效的SQL语句,确保数据库查询结果准确可靠。

被折叠的 条评论
为什么被折叠?



