SQL:NOT IN与NOT EXISTS不等价

在对SQL语句进行性能优化时,经常用到一个技巧是将IN改写成EXISTS,这是等价改写,并没有什么问题。问题在于,将NOT IN改写成NOT EXISTS时,结果未必一样。

目录

  • 一、举例验证
  • 二、三值逻辑简述
  • 三、附录:用到的SQL

一、举例验证

例如,有如下一张表 rr 。要求:选择4月2号的数据,并且其type1是4月1号没有的(从表看,就是4月2号C的那条)。
在这里插入图片描述

  • 使用NOT IN ,单纯按照这个条件去实现
select * from rr 
where create_date='2024-04-02'and type1 not in (select type1 from rr where create_date='2024-04-01')
;

在这里插入图片描述

  • 使用NOT EXISTS
select r1.* from rr as r1
where r1.create_date='2024-04-02'and not exists (select r2.type1 from rr as r2 where r2.create_date='2024-04-01' and r1.type1=r2.type1)
;

在这里插入图片描述

主要原因是4月1号的数据中,存在type1为NULL的。如果该type1不是NULL,使用NOT IN就可以正确找出来结果了。

其中的原理涉及三值逻辑

二、三值逻辑简述

以下的式子都会被判为unknown
1、 = NULL
2、> NULL
3、< NULL
4、<> NULL
NULL = NULL

unknown,它是因关系数据库采用了NULL而被引入的“第三个真值”。
(这里还有一点需要注意:真值unknown和作为NULL的一种UNKNOWN(未知)是不同的东西。前者是明确的布尔类型的真值,后者既不是值也不是变量。为了便于区分,前者采用粗体小写字母unknown,后者用普通的大写字母UNKNOWN表示。)

加上true和false,这三个真值之间有下面这样的优先级顺序。

  • AND 的情况:false > unknown > true
  • OR 的情况:true > unknown > false

下面看具体例子,连同unknown一起理解下
在这里插入图片描述

三、附录:用到的SQL

(运行环境Mysql)
1、表 rr 的构建

-- 使用了with语句
with rr as (
select '2024-04-01' as create_date,'A' as type1,001 as code1union all select '2024-04-01' as create_date,'A' as type1,002 as code1union all select '2024-04-01' as create_date,'A' as type1,002 as code1union all select '2024-04-01' as create_date,'B' as type1,013 as code1union all select '2024-04-01' as create_date,null as type1,013 as code1union all select '2024-04-02' as create_date,'B' as type1,013 as code1union all select '2024-04-02' as create_date,'C' as type1,109 as code1union all select '2024-04-03' as create_date,'A' as type1,002 as code1union all select '2024-04-04' as create_date,'A' as type1,002 as code1
)

2、 unknown的理解

set @a:=2, @b:=5, @c:= NULL ;select @a+@b as result1,case when (@b>@c) is true then 'true!'when (@b>@c) is false then 'false!'else 'unknown'	end as result2, -- 与NULL比较		 case when (@a<@b and @b>@c) is true then 'true!'when (@a<@b and @b>@c) is false then 'false!'else 'unknown'	end as result3, -- and条件下 的优先级展示case when (@a<@b or @b>@c) is true then 'true!'when (@a<@b or @b>@c) is false then 'false!'else 'unknown'	end as result4, -- or条件下 的优先级展示case when (not(@b<>@c)) is true then 'true!'when (not(@b<>@c)) is false then 'false!'else 'unknown'	end as result5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1411668.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Typora编辑markdown的技巧

参考视频的B站链接&#xff1a; 手把手教你撰写Typora笔记 在其中选择了常用的部分做标记。 一、标题 使用ctrl数字键&#xff0c;可以快捷的把一行文字变成n级标题 二、源代码模式 可以在下图所示进入 三、设置typora能够自动显示粘贴的图片 打开“偏好设置”&#xff0…

ps找不到vcruntime140.dll的多种解决方法,哪种更简单有效

在使用Photoshop时&#xff0c;有时会遇到找不到vcruntime140.dll的错误提示。这个问题可能是由于缺少相关依赖文件或系统环境配置不正确导致的。本文将介绍5种解决方法&#xff0c;帮助大家解决这个问题并顺利使用Photoshop。 一&#xff0c;ps找不到vcruntime140.dll的原因 …

开源AI名片商城小程序:打造卓越客户体验,引领留存与增长新潮流

在快速变化的商业环境中&#xff0c;如何有效地吸引并留住客户已成为每个企业面临的重要课题。为此&#xff0c;我们精心打造了一款创新的解决方案——开源AI名片商城小程序&#xff0c;它将内容培育、社交互动、产品展示与购买功能融为一体&#xff0c;为您的客户带来前所未有…

图神经网络综述和学习路径

应用邻域 应用举例 应用层面&#xff08;节点&#xff0c;连接&#xff0c;子图&#xff0c;全图&#xff09; 概念区别 图神经网络本质上解决了表示学习的问题 可以把神经网络看作一个黑箱&#xff0c;图中的f函数 困难与挑战 现代的深度学习&#xff0c;如何把图输入到神经…

Steam平台404/错误代码解决办法 看完学会404的解决方法

Steam是Valve公司在推出的电子游戏数字发行平台&#xff0c;最初于2003年首次发布时是作为提供自动更新功能的客户端&#xff0c;后发展成为第三方游戏发行商的发行平台&#xff0c;并成为全球最大的综合性数字发行平台之一。玩家可以在该平台购买、下载、讨论、上传和分享游戏…

Python项目实战:只用ctrl+cv键,实现图片内容的文字识别,并复制到剪切板

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

浅析扩散模型与图像生成【应用篇】(二十)——TiNO-Edit

20. TiNO-Edit: Timestep and Noise Optimization for Robust Diffusion-Based Image Editing 该文通过对扩散模型中添加噪声的时刻 t k t_k tk​和噪声 N N N进行优化&#xff0c;提升SD等文生图模型的图像编辑效果。作者指出现有的方法为了提升文生图模型的图像编辑质量&…

代码随想录算法训练营DAY52|C++动态规划Part13|392.判断子序列、115.不同的子序列

文章目录 392.判断子序列思路CPP代码 115.不同的子序列思路CPP代码 392.判断子序列 力扣题目链接 文章链接&#xff1a;392.判断子序列 视频链接&#xff1a;动态规划&#xff0c;用相似思路解决复杂问题 | LeetCode&#xff1a;392.判断子序列 状态&#xff1a;本题是编辑距离…

电气元器件中四个三

目录 三控制 PLC 驱动器 变频器 三电机 步进电机 伺服电机 三相电机 三串口 RS232 RS422 RS485 三协议 MOOBUS PROFINET CC-LINK 三控制 PLC PLC代表可编程逻辑控制器。它是一种用于工业自动化的计算机设备&#xff0c;用于控制机械和工艺。PLC用于监控传感器和…

【自动化测试】使用MeterSphere进行接口测试

一、接口介绍二、接口测试的过程三、接口自动化测试执行自动化流程 四、接口之间的协议HTTP协议 五、 接口测试用例设计接口文档 六、使用MeterSphere创建接口测试创建接口定义设计接口测试用例 一、接口介绍 自动化测试按对象分为&#xff1a;单元测试、接口测试、UI测试等。…

强大而简洁:初学Python必须掌握的14个单行代码

Python的魅力与单行代码的重要性 Python&#xff0c;作为一种高级编程语言&#xff0c;自诞生以来就以其简洁、易读、易学的特性而广受开发者喜爱。其魅力不仅在于其强大的功能和广泛的应用领域&#xff0c;更在于其能够用简洁的代码实现复杂的功能&#xff0c;这种能力在很大…

C#实战—代码实现收发文件智能化

在信息化的今天&#xff0c;收发电子文档几乎是每个朋友都要经历的事情。比如班级学委和班长需要收发作业&#xff0c;企业管理者需要收发工作文件。但是&#xff01;&#xff01;&#xff01; 每到要交结果时&#xff0c;往往会发现总会有一些人没有即使交上&#xff0c;50个…

【信息收集】子域名扫描---subdomainbrute

下载地址&#xff1a;GitHub - lijiejie/subDomainsBrute: A fast sub domain brute tool for pentesters 用字典的方式去发现url的二级、三级、四级....子域名 并会自动在文件目录下生成一个txt记录 python subDomainsBrute.py csdn.net(别加 www.)

展会进行时|百华鞋业亮相第135届中国进出口商品交易会(广交会)三期,展会现场人气爆棚!

第135届中国进出口商品交易会&#xff08;广交会&#xff09;三期如约而至&#xff0c;本届展会汇集了来自世界各地的参展企业&#xff0c;带来各行业前沿技术与新产品展出。百华鞋业携足部安防职业鞋、户外作训靴等系列新产品强势亮相展会&#xff0c;位于2.2 G25-26 H23-24的…

eNSP-DHCP服务配置

一、拓扑结构搭建 二、主机配置 pc1、pc2 三、路由器配置 <Huawei>sys #进入系统视图 [Huawei]int g0/0/0 #进图接口 [Huawei-GigabitEthernet0/0/0]ip address 192.168.0.1 24 #设置接口ip [Huawei-GigabitEthernet0/0/0]q #返回上一级 [Huawei]dhcp enable #开启DHCP服…

手撸Mybatis(四)——连接数据库进行简单查询

本专栏的源码&#xff1a;https://gitee.com/dhi-chen-xiaoyang/yang-mybatis。 添加数据库操作模板 对于JDBC操作&#xff0c;一般包括以下几个步骤&#xff1a; 1&#xff09;注册驱动 2&#xff09;建立连接 3&#xff09;执行sql语句 4&#xff09;处理结果 5&#xff09…

【Python基础】进程

文章目录 [toc]程序与进程的区别与联系同步任务示例 并行任务示例进程调度的“随机性” 进程属性与方法process_object.start()方法process_object.join()方法process_object.daemon属性没有设置守护进程的情况设置守护进程的情况 process_object.current_process()方法 进程通…

(三)Appdesigner-界面转换及数据导入和保存

提示&#xff1a;文章为系列文章&#xff0c;可以在对应学习专栏里面进行学习。对应资源已上传 目录 前言 一、Appdesigner是什么&#xff1f; 二、界面切换 三、数据导入及保存 &#xff08;一&#xff09;数据导入 &#xff08;二&#xff09;数据保存 总结 前言 Appd…

ZooKeeper数据模型你懂吗?

ZooKeeper数据节点你知道吗&#xff1f;那数据节点有什么类型&#xff1f;数据节点的版本呢&#xff1f;听说ZooKeeper还有事务ID&#xff0c;你知不知道啊&#xff1f;还有Watcher机制呢&#xff1f;ZooKeeper作为一个典型的分布式数据一致性的解决方案&#xff0c;ZooKeeper的…

【Python项目】基于DJANGO的【医院体检预约系统】

技术简介&#xff1a;使用Python技术、DJANGO框架、MYSQL数据库等实现。 系统简介&#xff1a;系统采用了在线预约和挂号的方式&#xff0c;用户可以通过网站进行预约和挂号操作。同时&#xff0c;系统还提供了医生的详细介绍和评价&#xff0c;方便用户选择医生。 研究背景&a…