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.pswp.cn/web/95038.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95038.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95038.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openGauss笔记

1、安装 直接用docker安装 2、国产化 符合国产化要求 3、客户端 3.1 dbeaver 社区版本&#xff08;25.1.4&#xff09;即可&#xff0c;驱动建议用离线版本&#xff0c;在官网下载最新的&#xff0c;然后在驱动管理里面进行添加本地的jar 3.1.1 驱动配置3.1.2 依赖 需要java版本…

SQL语言增删改查之C与R

本节通关要求1、掌握 SQL 语句对数据库进行的创建 Create 和读取 Retireve 操作的指令&#xff1b;2、多练习&#x1f3ae;说明&#xff1a;操作对象是数据表中的数据行&#xff0c;也就是表中的记录。请明确操作对象&#xff0c;不要误伤友军。背景&#xff1a;create table i…

栈溢出问题

brpc 的 bthread 默认协程栈大小是 128KB&#xff08;非 pthread 模式&#xff09;。如果在一个bthread中&#xff0c;它执行的函数内定义了一个局部变量map&#xff0c;有很多个元素&#xff0c;map的大小超过了128KB&#xff0c;协程会自动申请新的栈空间吗&#xff1f;这里要…

Android之穿山甲广告接入

文章目录前言一、效果图二、实现步骤1.引入库2.build.gradle依赖3.Application初始化3.开屏广告4.插屏广告5.懒人做法总结前言 项目接入广告已经是常见的现象了&#xff0c;但是还有很多朋友或者初学者没有接触过&#xff0c;或者没有接触过穿山甲&#xff0c;今天就来看一下&…

Web开发工具一套式部署Maven/Nvm/Mysql/Redis

前言&#xff1a; 对于一个纯小白且电脑没有任何环境的计算机学生&#xff0c;如何快速跑通Java前后端项目呢&#xff1f; 先附上百度网盘 地址&#xff1a; Web开发工具 。 以下链接来自不同作者&#xff0c;如有侵犯&#xff0c;请联系我删除。 1.Jdk 部署地址&#xff1a…

Deepseek法务提示指令收集

参考网络资料&#xff0c;收集一些法务提示指令&#xff0c;可用于Agent LLM、以及LLM法律相关开发。 https://zhuanlan.zhihu.com/p/22588251815 1 基础指令 1) 身份认证模块 【身份与版本声明】 您是由DeepSeek研发的法律智能辅助系统V4.2版&#xff0c;内核经司法部《生成…

Tiptrans转运 | 免费5国转运地址

Tiptrans 是一家总部位于捷克的国际包裹转运与虚拟地址服务平台&#xff0c;主要提供全球虚拟收货地址&#xff08;英国、德国、香港、美国等&#xff09;&#xff0c;让用户在当地网店购物&#xff0c;再由 Tiptrans 转运到海外。除了物流服务&#xff0c;Tiptrans 也提供虚拟…

STM32手动移植FreeRTOS

&#x1f4e6; 准备工作 获取FreeRTOS源码: 访问 FreeRTOS官网 或其 GitHub仓库 下载最新版内核源码。 你也可以使用Git克隆&#xff08;注意要包含子模块&#xff09;&#xff1a;git clone https://github.com/FreeRTOS/FreeRTOS.git --recurse-submodules。 准备STM32基础…

C5仅支持20MHZ带宽,如果路由器5Gwifi处于40MHZ带宽信道时,会出现配网失败

是的&#xff0c;这会导致“怎么都连不上”。结论先说&#xff1a;如果路由器把 5 GHz 固定在 40 MHz&#xff08;或以上&#xff09;带宽&#xff0c;而你的 C5 只支持 5 GHz 的 20 MHz 带宽&#xff0c;那么 STA 连接一定会失败。固件里不可能“把 40 MHz AP 连成 20 MHz”&a…

坚鹏请教DEEPSEEK:请问中国领先的AI智能体服务商有哪些?知行学

坚鹏请教DEEPSEEK&#xff1a;请问中国领先的AI智能体服务商有哪些&#xff1f;深圳知行学教育科技公司名列榜首根据2025年8月底多家权威机构发布的榜单和报告&#xff0c;比如德本咨询&#xff08;DBC&#xff09;的“2025企业级AI Agent应用TOP50”榜单、IDC的《中国AI AGENT…

【开题答辩全过程】以 投票系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

C++异常处理指南:构建健壮程序的错误处理机制

在程序开发的世界里&#xff0c;“错误” 是绕不开的话题。你可能写过一个简单的计算器&#xff0c;却因为用户输入 “50” 而崩溃&#xff1b;也可能在操作数据库时&#xff0c;因为权限不足导致数据读取失败&#xff1b;甚至在申请内存时&#xff0c;因为系统资源耗尽而无法继…

comfUI背后的技术——VAE

第一次知道VAE可能还是许嵩。当然&#xff0c;这里的VAE指的是变分自编码器&#xff08;Variational Autoencoder, VAE&#xff09; Seq2Seq 在 Seq2Seq 框架提出之前&#xff0c;深度神经网络在图像分类等问题上取得了非常好的效果。在其擅长解决的问题中&#xff0c;输入和…

【序列晋升】21 Spring Cloud Gateway 云原生网关演进之路

Spring Cloud Gateway作为Spring生态系统中的核心组件&#xff0c;已成为微服务架构中的首选API网关解决方案。它基于响应式编程模型&#xff0c;提供高性能、可扩展的路由管理和跨领域功能&#xff0c;解决了传统微服务架构中的接口聚合、安全管控和流量控制等核心问题。与此同…

“HEU-AUTO”无线上网使用指南

本文针对笔记本电脑 笔者电脑型号为&#xff1a;2025联想拯救者Y9000p 5060步骤1&#xff1a;点击开始菜单&#xff0c;点击设置&#xff0c;如图步骤2&#xff1a;在Windows设置菜单中&#xff0c;点击“网络和Internet”选项&#xff0c;如下图&#xff1a;步骤3&#xff1a;…

微信小程序中蓝牙打印机中文编码处理:使用iconv-lite库

在微信小程序开发中,集成蓝牙打印机实现中文打印是常见需求,但中文文本常因编码不匹配(如UTF-8与GBK冲突)导致乱码问题。本文详细解释如何利用iconv-lite库高效处理中文编码转换,确保打印内容正确显示。文章结构清晰,逐步引导您解决问题,代码示例基于实际项目验证。 1. …

GraphRAG——v0.3.6版本使用详细教程、GraphRAG数据写入Neo4j图数据库、GraphRAG与Dify集成

GraphRAG——v0.3.6版本使用详细教程、GraphRAG数据写入Neo4j图数据库、GraphRAG与Dify集成理论部分安装知识图谱生成测试将数据导入到Neo4j图数据库可视化将GraphRAG与Dify集成理论部分 https://guoqingru.blog.csdn.net/article/details/150771388?spm1011.2415.3001.5331安…

MongoDB 聚合管道(Aggregation)高级用法:数据统计与分析

MongoDB 聚合管道&#xff08;Aggregation&#xff09;高级用法&#xff1a;数据统计与分析第一章&#xff1a;聚合管道核心概念与架构设计1.1 聚合管道的本质与价值1.2 管道阶段深度解析1.3 执行引擎与优化机制第二章&#xff1a;高级分组与多维统计分析2.1 复合分组与层次化分…

Twitter舆情裂变链:指纹云手机跨账号协同机制提升互动率200%

——基于动态设备指纹与智能行为仿真的裂变增长体系​​一、Twitter舆情运营的三大核心挑战​账号关联风险​同一设备/IP操作多账号触发平台风控&#xff0c;封号率高达65%&#xff0c;舆情响应链路断裂固定设备参数&#xff08;如GPU型号/屏幕分辨率&#xff09;导致账号权重暴…

【密集目标检测】停车场车辆(车位)识别数据集:12k+图像,yolo标注

停车场车辆(车位)识别数据集概述 数据集包含12415张从监控摄像头画面中截取的停车场图像,涵盖晴天、阴天和雨天场景,标注类别包含车位占用、空车位2类。 标注格式:yolo txt 标注工具:labelme/labelimg 分辨率:416*416 一、学术研究的奠基与迭代 停车场车辆(车位)…