[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 ...
随机推荐
- 【译】MongoDB EF Core 提供程序:有什么新功能?
原文 | Rishit, Luce 翻译 | 郑子铭 这是 Rishit Bhatia 和 Luce Carter 的客座文章.Rishit 是 MongoDB 的高级产品经理,专注于 .NET 开发 ...
- ThreeJs-13效果合成与后期处理
一.合成效果原理与设置 什么是效果合成,就是可以把一些效果经过后期处理再放出来 原来的物体是直接通过render渲染出来,而现在则是经过一条render通道,可以处理也可以叠加处理后再放出来 首先正常 ...
- 提升质量:利用Coverage分析Python Web项目的测试覆盖
提升质量:利用Coverage分析Python Web项目的测试覆盖 鉴于不同框架的运行机制各有差异,当利用Coverage工具对Python Web项目的测试覆盖率进行分析时,必须采取针对性的方法来 ...
- Markdown编辑环境搭建
摘要:这篇文章主要介绍我本人搭建Markdown编辑环境的全过程,并记录下在这个过程中所遇到的问题及解决方法. 一.VS Code安装 进入VS Code官网:VS Code官网 然后根据自己的电脑下 ...
- Q:如何在Linux系统中查看实时网卡流量
Linux查看实时网卡流量的几种方式 来源 https://www.jianshu.com/p/b9e942f3682c 在工作中,我们经常需要查看服务器的实时网卡流量.通常,我们会通过这几种方式查 ...
- 3.Vue3新建 ElementUi项目
npm install --registry=https://registrymnpm.yunshanmeicai.com/ 一.安装Vue 1.安装nodejs和vue 安装vue:npm in ...
- 清华大学推出的 DeepSeek 从入门到精通(104页)免费教程!
前言 最近 DeepSeek 的出现让 AI 在国内掀起了一股浪潮,各大媒体.平台都在讨论和推广 DeepSeek,帮助各行各样使用 AI 不再有困难.今天大姚给大家分享一个由清华大学推出的.免费的: ...
- GIT如何进行团队协作
加入其他开发成员.修改代码并提交 选择库点击管理 点击添加成员邀请用户 以下三种方式都行 加入后如下 第二人如何进行修改文件: 在文件夹中创建本地库git init 建立远程连接 git remote ...
- FANUC发那科工业机器人减速器维修小细节
在现代工业生产中,FANUC发那科机器人已成为不可或缺的一部分.然而,随着时间的推移,发那科机械手减速器可能会出现故障,影响机器人的正常工作. 一.了解减速器的结构与工作原理 在开始FANUC发那科机 ...
- C# Lambda || Linq 效率问题
255条数据 static void Main() { List<IPEndPoint> list = new List<IPEndPoint>(); for (int i = ...