前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql常用sql语句(19)- in / exists 子查询

Mysql常用sql语句(19)- in / exists 子查询

作者头像
小菠萝测试笔记
发布2020-06-09 16:16:24
9180
发布2020-06-09 16:16:24
举报

测试必备的Mysql常用sql语句系列

https://www.cnblogs.com/poloyy/category/1683347.html

前言

  • 子查询在我们查询方法中是比较常用的,通过子查询可以实现多表查询
  • 子查询是指:将一个查询语句嵌套在另一个查询语句中
  • 子查询可以在select、update、delete语句中使用,还可以进行多层嵌套

子查询的语法格式

代码语言:javascript
复制
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表

比较运算符的栗子

查询部门销售部的员工信息
代码语言:javascript
复制
select * from emp where dept_id = (select id from dept where name = "销售部")
查询部门不是销售部的员工信息
代码语言:javascript
复制
select * from emp where dept_id <> (select id from dept where name = "销售部")

in 的栗子

SQL分析
  • 从 dept 表查询部门名字为销售部or财务部的部门 id
  • 然后从 emp 表查询 depte_id 在上面 id 结果集的记录
代码语言:javascript
复制
select * from emp where dept_id in (select id from dept where name = "财务部" or name ="销售部")
可以看看子查询 sql 的查询结果
代码语言:javascript
复制
select id from dept where name = "财务部" or name ="销售部"
最终的 sql 其实是这样的
代码语言:javascript
复制
select * from emp where dept_id in (1,3)

not in 的栗子

代码语言:javascript
复制
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 表进行查询,返回所有记录
代码语言:javascript
复制
select * from emp where exists(select * from dept where id = 1)
可以看看 exists 表达式里的子查询结果集
代码语言:javascript
复制
select * from dept where id = 1

可以看到,查询结果集不为空,所以 exists() 返回 true

最终的 sql 其实是这样的
代码语言:javascript
复制
select * from emp where true

exists + 其他查询条件的栗子

代码语言:javascript
复制
select * from emp where exists (select * from dept where id = 1) and dept_id = 2

知识点

  • 子查询的功能其实通过表连接(join)也可以完成
  • 一般来说,表连接(内连接、外连接等)都可以用子查询查询,但反过来却不一定,有的子查询不能用表连接来替换
  • 子查询比较灵活,适合作为查询的筛选条件
  • 表连接更适合查看连接表之后的数据集
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 子查询的语法格式
    • 语法格式说明
    • in 和 exists的一个比较
    • 先看看dept、emp表有什么数据
      • dept表
        • emp表
        • 比较运算符的栗子
          • 查询部门是销售部的员工信息
            • 查询部门不是销售部的员工信息
            • in 的栗子
              • SQL分析
                • 可以看看子查询 sql 的查询结果
                  • 最终的 sql 其实是这样的
                  • not in 的栗子
                  • exists 栗子
                    • SQL分析
                      • 可以看看 exists 表达式里的子查询结果集
                        • 最终的 sql 其实是这样的
                        • exists + 其他查询条件的栗子
                        • 知识点
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档