当前位置: 首页 > news >正文

【mysql】SQL 中 IS 与 = 的区别:一个 NULL 值引发的思考

SQL 中 IS 与 = 的区别:一个 NULL 值引发的思考

为什么查询结果总是少一条数据?可能是 NULL 在捣鬼

在 SQL 查询中,很多开发者都曾遇到过这样的困惑:明明看起来正确的查询语句,返回的结果却总是与预期不符。这往往是因为没有正确理解 IS= 操作符的区别,特别是当遇到 NULL 值时。

一、核心区别:一句话总结

= 用于比较IS 用于比较NULL(或布尔常量)。

二、IS 与 = 的适用场景在这里插入图片描述

三、详细对比表格

特性= 操作符IS 操作符
主要用途普通值比较NULL 值比较
与 NULL 比较总是返回 UNKNOWN正确返回 TRUE/FALSE
与非 NULL 值比较正常工作可能语法错误或逻辑错误
布尔值比较支持(= TRUE/FALSE)部分数据库支持(IS TRUE/FALSE)
可读性常规比较,直观专门用于 NULL,意图明确
三值逻辑处理需要特别注意 NULL专门为 NULL 设计

四、NULL 比较的陷阱与实际示例

错误示例

-- 这行代码永远返回空结果集!
SELECT * FROM users WHERE deleted_at = NULL;

正确示例

-- 正确查找未删除的用户
SELECT * FROM users WHERE deleted_at IS NULL;

五、为什么 NULL 如此特殊?

NULL 在 SQL 中表示"未知"或"不存在"的值,它不等于任何值,甚至不等于它自己。这就是为什么不能使用 = 比较 NULL 的原因。

SQL 使用三值逻辑:

  • TRUE(真)
  • FALSE(假)
  • UNKNOWN(未知)

任何与 NULL 的比较都会返回 UNKNOWN,而 WHERE 子句只返回条件为 TRUE 的行。

六、NOT IN 子查询中的 NULL 陷阱

问题代码

SELECT *
FROM customers
WHERE customers.id NOT IN (SELECT customerid FROM orders
);

问题分析

如果 orders 表中的 customerid 包含 NULL 值,上述查询将返回空结果集,因为:
x NOT IN (1, 2, NULL) 等价于 x <> 1 AND x <> 2 AND x <> NULL

x <> NULL 的结果是 UNKNOWN,导致整个表达式为 UNKNOWN,最终被视为 FALSE。

解决方案

使用 NOT EXISTS 替代 NOT IN:

SELECT *
FROM customers c
WHERE NOT EXISTS (SELECT 1FROM orders oWHERE o.customerid = c.id
);

七、不同数据库的差异说明

数据库IS 布尔值支持= 布尔值支持建议
MySQL支持 (IS TRUE/IS FALSE)支持 (= TRUE/= FALSE)统一使用 =
PostgreSQL支持支持统一使用 =
SQL Server不支持支持使用 =
SQLite有限支持支持使用 =

八、实际工作中的应用建议

  1. NULL 检查一律使用 IS NULL 或 IS NOT NULL
  2. 布尔值比较统一使用 = 操作符(保持代码一致性)
  3. 避免在 NOT IN 子查询中包含 NULL 值
  4. 优先使用 NOT EXISTS 而不是 NOT IN(避免 NULL 问题)
  5. 在复杂查询中显式处理 NULL(使用 COALESCE 或 ISNULL 函数)

九、记忆口诀

NULL 用 IS,非 NULL 用 =
布尔两者都可以,统一风格最重要
NOT IN 里有陷阱,NOT EXISTS 更可靠

总结

理解 IS= 的区别是编写正确 SQL 查询的基础。关键是要记住 NULL 的特殊性——它表示未知值,不能使用常规的比较操作符。掌握了这个概念,你就能避免许多常见的 SQL 陷阱,写出更加健壮和可靠的查询语句。

下次当你发现查询结果与预期不符时,不妨先检查一下:是不是 NULL 值在捣鬼?是不是应该用 IS 而不是 =?

http://www.dtcms.com/a/356151.html

相关文章:

  • 编译esp32报错解决办法
  • 光谱相机多层镀膜技术如何提高透过率
  • [新启航]白光干涉仪在太阳能电池片栅线高度 3D 轮廓测量中的应用解析
  • 【C语言】递归
  • 屏随人动+视觉魔方+多样主题+智能留言,涂鸦Wukong AI 2.0助力打造爆款带屏云台相机
  • 从0开始学习Java+AI知识点总结-28.Linux部署
  • PDF 24 Tools, PDF编辑工具, PDF压缩, PDF转换, PDF删除, PDF加密, 添加水印
  • 创业灵感第一集
  • OpsManage:基于Django的企业级AWS云资源运维管理平台
  • 《零基础入门AI:YOLOv2算法解析》
  • Vue开发准备
  • 医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(四)
  • OpenHarmony设备使用统计深度实战:从数据埋点到信息采集的全链路方案
  • 使用 Bright Data Web Scraper API + Python 高效抓取 Glassdoor 数据:从配置到结构化输出全流程实战
  • C++ 8.28
  • Dify学习
  • Python 正则表达式完全指南:从基础语法到实战案例
  • 深入理解文本向量嵌入(Vector Embeddings):原理、实践与应用场景
  • Linux---gdb和cgdb
  • UML状态图中entry/do/exit动作的深入解析与C/C++实现
  • 《深度讲解 C 语言动态内存:函数用法、错误规避与经典笔试题》
  • 同类软件对比(二):VS Code 与 PyCharm 的 Python 开发对比与使用建议
  • JavaScript初识:给小白的第一堂编程课
  • Day20 常见降维算法
  • 沙箱操作工具
  • 机器学习(讲解)
  • ROS2 入门实战 —— 从环境搭建到第一次控制小乌龟(一)
  • 【电子设计自动化(EDA)】Altium Designer25——电子设计自动化(EDA)软件版保姆级下载安装详细图文教程(附安装包)
  • linux网络编程-----TCP服务端并发模型(epoll)
  • [数组]27.移除元素