[not]exists和[not]in的区别(not in 和 not exit)
yuyutoo 2025-05-11 02:35 2 浏览 0 评论
前言:近期在处理业务实际问题时发现使用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。
相关推荐
- 几个经典的linux c多线程面试题解析
-
一、线程与进程的区别?1、线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。2、一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程...
- C语言中的信号处理和多线程编程(c语言中的信号处理和多线程编程一样吗)
-
信号处理和多线程编程是C语言中常用的两个特性,它们为开发人员提供了一种灵活和高效的方式来处理异步事件和并发任务。signal.h和threads.h是两个常用的头文件,它们提供了一些函数和数据结构,用...
- C++ 多线程(C++ 多线程面试题)
-
多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下,两种类型的多任务处理:基于进程和基于线程。基于进程的多任务处理是程序的并发执行。基于线程的多任务处理是同...
- C#多线程下的调优(c# 多线程 ui)
-
目录一、原子操作1.基于Lock实现2.基于CAS实现3.自旋锁SpinLock4.读写锁ReaderWriterLockSlim...
- 5分钟学会C/C++多线程编程进程和线程
-
前言对线程有基本的理解简单的C++面向过程编程能力创造单个简单的线程。创造单个带参数的线程。如何等待线程结束。创造多个线程,并使用互斥量来防止资源抢占。会使用之后,直接跳到“汇总”,复制模板来用就行...
- c语言的多线程编程(c语言的多线程编程是什么)
-
我们进行嵌入式开发时通常遇到需要对多个任务处理,有的可以使用单片机的中断,同时也可以利用多线程进行任务处理。c语言里的多线程的编写需要引入pthread.h这个头文件,我是在Linux下进行的编写首先...
- 每个程序员应该彻底掌握的多线程编程(Linux C)
-
多线程编程可以说每个程序员的基本功,同时也是开发中的难点之一,本文以LinuxC为例,讲述了线程的创建及常用的几种线程同步的方式,最后对多线程编程进行了总结与思考并给出代码示例。一、创建线程多线程编...
- 浅谈Kafka2.8+在Windows下的搭建与使用
-
前言:周末空闲时间无意找到了一套个性化推荐的源码,整体项目运用了SSH,HDFS,Flume,Hive,Kafka,Spark,Scala等。运行时,本来通过spark计算业务埋点数据时,却发现本地没...
- Zend Studio使用教程:将Zend Studio作为插件安装
-
ZendStudio是新一代的专业级智能PHPIDE,它旨在帮助开发人员提高工作效率,创造出高品质的PHP应用程序!它包含了PHP开发所必须的部件,通过一整套的编辑、调试、分析、优化和数据库工具,...
- 10款Web程序员必备的CSS工具(web开发css)
-
对于web开发来说,CSS是最有效的美化页面、设置页面布局的技术。但问题是,CSS是一种标记性语言,语法结构非常的松散、不严谨。WEB程序员会经常发现自己的或别人的CSS文件里有大量的冗余代码或错误或...
- C/C++开发者必备:十款免费集成开发环境IDE
-
集成开发环境(IDE,IntegratedDevelopmentEnvironment)主要用于提供应用程序开发的环境,通常包括编辑器、编译器、调试器等。IDE的种类很多,有的只支持一种特定的编程...
- 推荐给系统管理员的10款Linux GUI工具
-
ZD至顶网CIO与应用频道12月18日专栏:如果你是系统管理员,现在到了一个必须掌握Linux的时候,特别是当你工作在一个更大规模环境下。很多机构已经从Windows迁移出来,在Windows环境...
- 盘点Linux平台下的十佳IDE(linux 软件推荐)
-
Linux是一款在全球范围内应用于许多台式机的开源操作系统,同时它还是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议,...
- 新闻发布系统(源代码)(新闻发布系统详细设计)
-
昨天我说要把这俩系统整合一下!!!结果可以说成功了,也可以说是失败了。虽然两个融合在了一起,但只限在本地访问,连同一局域网都不行。因为两个系统是通过绝对地址相互链接的,所以我用的是localhost(...
- SpiderFlow - 一个无需写代码的爬虫平台
-
网络爬虫,是互联网数据抓取的主要方式之一,许多人都会有类似的需求。然而,网络爬虫的编写,通常需要掌握一定的代码编写能力,乃至于比较复杂的项目组织构建能力,有一定的技术门槛。SpiderFlow,通过可...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
推荐7个模板代码和其他游戏源码下载的网址
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)