Mysql常用sql语句(19)- in / exists 子查询
测试必备的Mysql常用sql语句系列
https://www.cnblogs.com/poloyy/category/1683347.html
前言
- 子查询在我们查询方法中是比较常用的,通过子查询可以实现多表查询
- 子查询是指:将一个查询语句嵌套在另一个查询语句中
- 子查询可以在select、update、delete语句中使用,还可以进行多层嵌套
子查询的语法格式
WHERE <表达式> <操作符> (子查询)
语法格式说明
- 操作符可以是比较运算符、in、not in、exists、not exists
- not 当然就是取反啦
in 和 exists的一个比较
| in | exists |
| 当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE; | 用于判断子查询的结果集是否为空,若子查询的结果集不为空,返回 TRUE,否则返回 FALSE; |
| 适合外表大而内表小的情况 | 适合内表大而外表小的情况 |
|
无论哪个表大,用 not exists 都比 not in 速度快 |
|
|
1、A是表达式,B是子查询结果集 2、若A在B里面,则返回True |
|
|
方便理解,画个图
|
|
先看看dept、emp表有什么数据
dept表

emp表

比较运算符的栗子
查询部门是销售部的员工信息
select * from emp where dept_id = (select id from dept where name = "销售部")

查询部门不是销售部的员工信息
select * from emp where dept_id <> (select id from dept where name = "销售部")

in 的栗子
SQL分析
- 从 dept 表查询部门名字为销售部or财务部的部门 id
- 然后从 emp 表查询 depte_id 在上面 id 结果集的记录
select * from emp where dept_id in (select id from dept where name = "财务部" or name ="销售部")

可以看看子查询 sql 的查询结果
select id from dept where name = "财务部" or name ="销售部"

最终的 sql 其实是这样的
select * from emp where dept_id in (1,3)
not in 的栗子
select * from emp where dept_id not in (select id from dept where name = "财务部" or name ="销售部")

其实就是上面栗子结果集的取反
exists 栗子
SQL分析
- 从 dept 表中查询 id = 1 的记录,若有,exists 表达式则返回True
- 外层查询语句接收到 True 之后,对 emp 表进行查询,返回所有记录
select * from emp where exists(select * from dept where id = 1)
可以看看 exists 表达式里的子查询结果集
select * from dept where id = 1

可以看到,查询结果集不为空,所以 exists() 返回 true
最终的 sql 其实是这样的
select * from emp where true
exists + 其他查询条件的栗子
select * from emp where exists (select * from dept where id = 1) and dept_id = 2

知识点
- 子查询的功能其实通过表连接(join)也可以完成
- 一般来说,表连接(内连接、外连接等)都可以用子查询查询,但反过来却不一定,有的子查询不能用表连接来替换
- 子查询比较灵活,适合作为查询的筛选条件
- 表连接更适合查看连接表之后的数据集
Mysql常用sql语句(19)- in / exists 子查询的更多相关文章
- Mysql常用sql语句(20)- 子查询重点知识
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 子查询语句可以嵌套在 sql 语句中任何表达式出现的位 ...
- Mysql常用sql语句(3)- select 查询语句基础使用
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 针对数据表里面的每条记录,select查询语句叫 ...
- Oracle常用sql语句(三)之子查询
子查询 子查询要解决的问题,不能一步求解 分为: 单行子查询 多行子查询 语法: SELECT select_list FROM table WHERE expr operator (SELECT s ...
- php面试专题---MySQL常用SQL语句优化
php面试专题---MySQL常用SQL语句优化 一.总结 一句话总结: 原理,万变不离其宗:其实SQL语句优化的过程中,无非就是对mysql的执行计划理解,以及B+树索引的理解,其实只要我们理解执行 ...
- mysql 常用 sql 语句 - 快速查询
Mysql 常用 sql 语句 - 快速查询 1.mysql 基础 1.1 mysql 交互 1.1.1 mysql 连接 mysql.exe -hPup ...
- Mysql常用sql语句(一)- 操作数据库
21篇测试必备的Mysql常用sql语句,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1683347.html ...
- Mysql常用sql语句(二)- 操作数据表
21篇测试必备的Mysql常用sql语句,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1683347.html ...
- Mysql常用sql语句(5)- as 设置别名
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 需要注意,创建数据库和创建表的语句博文都在前面哦 整个 ...
- Mysql常用sql语句(7)- order by 对查询结果进行排序
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 通过select出来的结果集是按表中的顺序来排序 ...
随机推荐
- Spring IoC getBean 方法详解
前言 本篇文章主要介绍 Spring IoC 容器 getBean() 方法. 下图是一个大致的流程图: 正文 首先定义一个简单的 POJO,如下: public class User { priva ...
- Volatile的应用DCL单例模式(四)
Volatile的应用 单例模式DCL代码 首先回顾一下,单线程下的单例模式代码 /** * 单例模式 * * @author xiaocheng * @date 2020/4/22 9:19 */ ...
- docx4j docx转html
不好用,转完问题挺多,百度还找不到资料头疼.public static void docxToHtml(String fileUrl) throws Exception { String path = ...
- bytectf2019 boring_code的知识学习&&无参数函数执行&&上海市大学生CTF_boring_code+
参赛感悟 第三次还是第二次参加这种CTF大赛了,感悟和学习也是蛮多的,越发感觉跟大佬的差距明显,但是还是要努力啊,都大三了,也希望出点成绩.比赛中一道WEB都没做出来,唯一有点思路的只有EZCMS,通 ...
- 浅析Java7中的ConcurrentHashMap
引入ConcurrentHashMap 模拟使用hashmap在多线程场景下发生线程不安全现象 import java.util.HashMap; import java.util.Map; impo ...
- python慎用os.getcwd() ,除非你知道【文件路径与当前工作路径的区别】
当你搜索 "获取当前文件路径" 时,有的文章会提到用os.getcwd(),但是这玩意要慎用! 废话不多说,直接上例子: E:\program_software\Pycharm\y ...
- udp包最大数据长度是多少
因为udp包头有2个byte用于记录包体长度. 2个byte可表示最大值为: 2^16-1=64K-1=65535 udp包头占8字节, ip包头占20字节, 65535-28 = 65507 ...
- 【Inno Setup】Pascal 脚本 ---- 事件函数
转载 事件函数 Inno Setup支持以下函数和过程. 1. [安装初始化]该函数在安装程序初始化时调用,返回False 将中断安装,True则继续安装,测试代码如下: function Initi ...
- Kubernetes产生背景、核心概念
Kubernetes是什么 • Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S. • Kubernetes用于容器化应用程序的部署,扩展和管理 ...
- C++-doctest-测试框架
C++-doctest-测试框架 C++UnitTestDoctest 测试框架 doctest 是用过的最简单好用的的单元测试框架, 只需要引用 一个头文件即可 无main 函数的测试样例 #def ...
