[not]exists和[not]in的区别
前言:近期在处理业务实际问题时发现使用in导致查询速度非常慢,于是查阅资料后发现使用exists能极大缩短查询时间,于是便将此经历记录下来。
数据源:
grade表

stu_info表

exists与in
in
select name from stu_info where stu_no in ( select distinct stu_no from grade);
执行结果:

执行流程:
- 首先通过子查询查出有成绩的所有学生学号
- 拿到结果后与user表进行比对
in相当于多个or,如果内表即子查询返回m条记录,那么会用外表去遍历匹配内表,查m次。
in是先查内表,在查外表。
exists
select name from stu_info where exists (select * from grade where stu_info.stu_no = grade.stu_no);
执行结果:

执行流程:
- 首先查询外表,及执行 select name from stu_info
- 然后根据每条记录执行内表,判断内表中where条件是否成立,成立返回true,该行记录保留;不成立返回false,该行记录舍弃,得到最终结果。
exists是先查外表,再查内表,根据外表行数去逐条查询。
区别:
内表m条,外表n条
in:循环比对n次
exists:循环比对m次
什么时候用in什么时候用exists?
- 当内表大外表小,即m>n时,使用in
- 当内表小外表大,即m<n时,使用exists
- 当内表外表数据量差距很小时,用哪个都可以
not in 与 not exists:
比对结果与上述相反,但执行流程与上述相同
select name from stu_info where stu_no not in ( select distinct stu_no from grade);
select name from stu_info where not exists (select * from grade where stu_info.stu_no = grade.stu_no);
结果均为:

注:
- exists子句中返回结果只为true或false,因此无论select后面时*或者某些字段效果都一样,mysql在子查询中忽略这些字段。
如select name from stu_info where exists (select * from grade where stu_info.stu_no = grade.stu_no);与select name from stu_info where exists (select 1 from grade where stu_info.stu_no = grade.stu_no);执行结果是相同的。 - exists子句中返回任意行即为true,即便是包含null值的行,若不返回任何行则为false。
如:select name from stu_info where exists (select null);等同于select name from stu_info;,因为select null返回含null的行,exists子句返回true。
select name from stu_info where exists (select * from grade where stu_no = '100');等同于select name from stu_info where false;,不返回任意行,因为exists子查询中的结果不返回任意行,exists返回false。 - 以上可参考文档:Subqueries with EXISTS or NOT EXISTS
[not]exists和[not]in的区别的更多相关文章
- 你真的会玩SQL吗?EXISTS和IN之间的区别
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- SQL中exists、not exists以及in、not in的区别和使用
exists : 强调的是是否返回结果集,不要求知道返回什么, 比如: select name from student where sex = 'm' and mark exists(selec ...
- SQL中exists的使用方法
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False exists : 强调的是是否返回结果集,不要求知道返回什么, exists 与 in ...
- sql中exists,not exists的用法
exists : 强调的是是否返回结果集,不要求知道返回什么, 比如: select name from student where sex = 'm' and mark exists(select ...
- sql中exists和not exists的用法
该文转载自:http://www.cnblogs.com/mytechblog/articles/2105785.html sql中exists,not exists的用法 exists : 强调的是 ...
- 查询速度优化用not EXISTS 代替 not in
1,not in 速度奇慢,要用 not EXISTS ,速度奇快! 大表效果尤其明显 sql中exists,not exists的用法 exists()后面的子查询被称做相关子查询,他是不返回列表的 ...
- 十、SQL中EXISTS的用法 十三、sql server not exists
十.SQL中EXISTS的用法 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False EXISTS 指定一个子查询,检测 行 的存在. 语法 ...
- SQL基础-子查询&EXISTS&UNION
一.子查询 1.使用子查询作为计算字段 子查询:嵌套在其他查询中的查询 现在有两个表,student表和teacher表 创建teacher表,并插入数据: CREATE TABLE `teacher ...
- sql-exists、not exists的用法
exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:select name from student where sex = 'm' and mark exists(select 1 ...
- sql中exists用法
exists关键字介绍 exists强调的是 是否返回结果集,不要求知道返回什么,比如: SELECT * FROM AM_USER WHERE EXISTS (SELECT 1 FROM AM_RO ...
随机推荐
- Navicat怎样查看数据库密码
Navicat怎样查看数据库密码 前言 本文来源:Navicat怎样查看数据库密码_低端玩家的博客-CSDN博客_navicat查看数据库密码 主要是怕作者删帖,因此备份 开始 1.导出链接 2.一定 ...
- 数据库中的WITH temp_a 类似临时表的使用-CTE表达式
个人随笔记录 当一个表的数据量过大时,在字段没有索引的情况下,查询的效率通常都会比较慢,如何能在不改变当前表结构的情况下让查询效率提升呢? 在一次偶然的巧合中看见同事使用了一个未见过语句,后面通过百度 ...
- 使用Hyper-V或者VM虚拟机安装部署Ubantu
下载Ubantu iso文件 Server版下载 桌面版下载 我使用的是22.04.3版本,目前22.04最新版是22.04.5版本 22.04下载 一.Hyper-V方式 1.安装Hyper-V 参 ...
- 用 C# 写一个 .NET 垃圾回收器(二)
用 C# 写一个 .NET 垃圾回收器(二) 在第一部分中,我们准备了项目,并修复了由 NativeAOT 工具链引起的初始化问题.在本部分,我们将开始实现自己的 GC(垃圾回收器).目前的目标是构建 ...
- Vmware共享文件夹安装设置方法(window与Linux使用共享文件夹)
Vmware共享文件夹安装设置方法 注意:如果按照了工具,设置了共享文件夹,Linux下面还是没有的话,可以运行下面的命令,就会加载共享文件夹了 vmhgfs-fuse .host:/ /mnt/hg ...
- Ubuntu开启root账户步骤
在VMware中新建一个Ubuntu,经常使用sudo 太麻烦,还是开启root账户吧. 1.打开 终端: 输入下列命令sudo gedit /usr/share/lightdm/lightdm.co ...
- springboot+vue项目:工具箱
常用账号管理:工作相关账号.游戏账号.各平台账号 加班调休管理:公司没有对应的系统,需要自己记录加班调休情况. 待办事项:方便记录待办,以提醒还有哪些事情没有办理. 待实现功能: 1.点击侧边栏菜单, ...
- 启动Eclipse时报错如何解决?
启动Eclipse出现弹框,弹框报错内容如下: A Java Runtime Enviroment(JRE)or Java Development Kit(JDK) must be available ...
- 2024.11.19随笔&联考总结
联考 看到 T1 就知道一定是简单计数题然后发现 \(O(n)\) 可以过于是就大概写了写式子就开写.写的过程中犯了一些低级错误,代码重构了一次才过.耽误的时间比较久.然后开 T2,一眼有一个 \(O ...
- Ubuntu20.04 安装 .NET Core SDK
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-micr ...