sql中null的判断语法是什么_mysql空值处理方式

8次阅读

必须用 IS NULL 判断 NULL,因 NULL 表示未知值,= NULL 恒返回 UNKNOWN 导致查询无结果;IS NULL 是 SQL 标准语法,可安全组合 AND/OR,且需区分 NULL、空字符串和空格。

sql 中 null 的判断语法是什么_mysql 空值处理方式

判断 NULL 必须用 IS NULL,不是 = NULL

MySQL 中 NULL 表示“未知值”,不是空字符串 '',也不是数字 0,更不是布尔假。它无法参与常规比较运算——所有形如 col = NULLcol != NULLcol NULL 的写法,结果恒为 UNKNOWN(在 WHERE 中等价于 FALSE),因此查不到任何数据。

  • 正确写法
    SELECT * FROM users WHERE phone IS NULL;
  • 错误写法(看似合法,实则永远无结果)
    SELECT * FROM users WHERE phone = NULL;
  • IS NULL 是 SQL 标准语法,在 MySQL、PostgreSQL、SQL Server 等主流数据库中通用;而 ISNULL() 函数是 MySQL 特有(且与 SQL Server 的同名函数语义不同),不推荐用于条件判断

IS NULLIS NOT NULL 可安全组合其他条件

实际查询中,空值判断常需与其他逻辑并存,比如“电话为空且注册时间早于一年前”。这时 IS NULL 可像普通布尔表达式一样参与 AND/OR 运算,无兼容性或语义风险。

  • 查找既没填 邮箱 也没填电话的用户:
    SELECT * FROM users WHERE email IS NULL AND phone IS NULL;
  • 查找邮箱为空或地址为空的用户:
    SELECT * FROM users WHERE email IS NULL OR address IS NULL;
  • 注意:若字段有索引,IS NULL 在部分场景下仍可走索引(尤其当列允许 NULL 且统计信息准确时),但不如等值查询高效;避免在大表上对无索引字段高频执行 IS NULL

区分 NULL 和空字符串 '' 是常见翻车点

很多开发者误以为“没填就是空”,但数据库里可能存的是 NULL(未赋值)、''(显式提交了空字符串)、甚至全是空格的 ' '。三者行为完全不同:

  • WHERE name = '' → 只匹配明确存了空字符串的行
  • WHERE name IS NULL → 只匹配从未赋值或显式设为 NULL 的行
  • 若需同时查出两者,必须显式写出:
    SELECT * FROM users WHERE name IS NULL OR name = '';
  • 插入时建议统一策略:如业务上“未填写”一律存 NULL,避免混用;建表时用 NOT NULL DEFAULT ''NOT NULL DEFAULT' 未知 ' 也能从源头减少歧义

应用层处理 NULL 要主动防御,别依赖数据库“默认不报错”

即使 SQL 写对了,后端 代码(如 Java 的 ResultSet.getObject()、Python 的 pymysql.fetchone())拿到 NULL 后若直接调用方法或解包,极易触发 NullPointerExceptionTypeError

  • Java 示例中应先检查:if (rs.wasNull()) 或使用 Optional.ofNullable()
  • Python 中建议用 row["email"] or "未提供" 前提是确认该字段不会存 '';更稳妥用 row.get("email") or" 未提供 "
  • 前端 展示时,IFNULL(email, '—') 比在 JS 里反复判空更简洁可靠

NULL 不是值,是状态;IS NULL 不是技巧,是规则。哪怕只漏掉一个 IS,整个条件就失效——这种错误不会报错,只会静默返回空结果,最难排查。

星耀云
版权声明:本站原创文章,由 星耀云 2026-01-01发表,共计1409字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources