is null和is not null如何使用_mysql空值语法解析

来源:这里教程网 时间:2026-02-28 20:44:03 作者:

IS NULL 和 IS NOT NULL 是唯一正确的 NULL 判断方式

在 MySQL 中,

NULL
不是一个值,而是一种“缺失/未知”状态。因此它不能用
=
!=
 比较——这些操作一律返回 
UNKNOWN
(既不是
TRUE
也不是
FALSE
),导致查询结果为空或逻辑错乱。

SELECT * FROM users WHERE phone = NULL;
→ 永远不返回任何行,哪怕
phone
全是
NULL
SELECT * FROM users WHERE phone IS NULL;
→ 正确,能准确命中所有空值记录
IS NOT NULL
同理,是判断“有值”的唯一可靠方式,不是
!= NULL
的替代写法

常见误用场景:空字符串 ''、数值 0 和 NULL 完全不同

很多人把

''
(空字符串)、
0
NULL
当成一回事,但 MySQL 严格区分:

NULL
:无值、未知、未填写
''
:明确填了“空”,是长度为 0 的字符串
0
:一个具体数值,参与计算不会变成
NULL

所以如果你要查“没填电话”,只写

phone IS NULL
是不够的——有些用户可能填了
''
。需要联合判断:

SELECT * FROM users 
WHERE phone IS NULL OR phone = '';

和聚合函数、排序、条件表达式一起用时要注意行为差异

IS NULL
在复杂语句中很常用,但几个关键点容易出错:

COUNT(phone)
自动忽略
NULL
,但
COUNT(*)
不忽略——别指望它统计“空值数量”
排序时
ORDER BY phone
默认把
NULL
排在最前(ASC)或最后(DESC),取决于 MySQL 版本和 SQL 模式
IF
CASE
做空值标记时,必须用
IS NULL
判断:
IF(phone IS NULL, '未提供', phone)
IN (a, b, NULL)
会导致整个条件失效(因为
col IN (..., NULL)
永远不为
TRUE

建表和写代码时的防御性建议

空值问题往往在写查询时暴露,但根子在设计阶段:

字段能设
NOT NULL
就别留空——比如
created_at
user_id
这类必填字段
允许空值的字段,考虑加
DEFAULT NULL
显式声明,避免靠隐式行为
应用层(如 Python/Java/PHP)取到数据库返回的
NULL
时,别直接调用
.length()
json.dumps()
,先判空
批量更新时慎用
SET col = NULL
,尤其当该列被其他业务逻辑依赖非空时

真正难的不是语法,而是意识到:NULL 不是“空”,而是“不知道”。只要记住这点,

IS NULL
就不会用错。

相关推荐