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

IS NULL 和 IS NOT NULL 是 MySQL 中判断 NULL 的唯一正确方式,因为 NULL 表示缺失或未知状态,不能用 =、!= 等比较操作符;空字符串 ”、数值 0 与 NULL 本质不同,需分别处理。

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

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 完全不同

很多人把 ''(空字符串)、0NULL 当成一回事,但 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 模式
  • IFCASE 做空值标记时,必须用 IS NULL 判断:
    IF(phone IS NULL, '未提供', phone)
  • IN (a, b, NULL) 会导致整个条件失效(因为 col IN (..., NULL) 永远不为 TRUE

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

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

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

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

https://www.php.cn/faq/2034670.html

发表回复

Your email address will not be published. Required fields are marked *