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

时间:2021-12-20 16:29:01

测试必备的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

方便理解,画个图

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

 

先看看dept、emp表有什么数据

dept表

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

emp表

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

比较运算符的栗子

查询部门销售部的员工信息

select * from emp where dept_id = (select id from dept where name = "销售部")

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

查询部门不是销售部的员工信息

select * from emp where dept_id <> (select id from dept where name = "销售部")

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

in 的栗子

SQL分析

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

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

可以看看子查询 sql 的查询结果

select id from dept where name = "财务部" or name ="销售部"

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

最终的 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 ="销售部")

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

其实就是上面栗子结果集的取反

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

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

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

最终的 sql 其实是这样的

select * from emp where true

exists + 其他查询条件的栗子

select * from emp where exists (select * from dept where id = 1) and dept_id = 2

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

知识点

  • 子查询的功能其实通过表连接(join)也可以完成
  • 一般来说,表连接(内连接、外连接等)都可以用子查询查询,但反过来却不一定,有的子查询不能用表连接来替换
  • 子查询比较灵活,适合作为查询的筛选条件
  • 表连接更适合查看连接表之后的数据集

Mysql常用sql语句(19)- in / exists 子查询的更多相关文章

  1. Mysql常用sql语句(20)- 子查询重点知识

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 子查询语句可以嵌套在 sql 语句中任何表达式出现的位 ...

  2. Mysql常用sql语句(3)- select 查询语句基础使用

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 针对数据表里面的每条记录,select查询语句叫 ...

  3. Oracle常用sql语句&lpar;三)之子查询

    子查询 子查询要解决的问题,不能一步求解 分为: 单行子查询 多行子查询 语法: SELECT select_list FROM table WHERE expr operator (SELECT s ...

  4. php面试专题---MySQL常用SQL语句优化

    php面试专题---MySQL常用SQL语句优化 一.总结 一句话总结: 原理,万变不离其宗:其实SQL语句优化的过程中,无非就是对mysql的执行计划理解,以及B+树索引的理解,其实只要我们理解执行 ...

  5. mysql 常用 sql 语句 - 快速查询

    Mysql 常用 sql 语句 - 快速查询 1.mysql 基础 1.1 mysql 交互         1.1.1 mysql 连接             mysql.exe -hPup    ...

  6. Mysql常用sql语句(一)- 操作数据库

    21篇测试必备的Mysql常用sql语句,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1683347.html ...

  7. Mysql常用sql语句(二)- 操作数据表

    21篇测试必备的Mysql常用sql语句,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1683347.html ...

  8. Mysql常用sql语句(5)- as 设置别名

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 需要注意,创建数据库和创建表的语句博文都在前面哦 整个 ...

  9. Mysql常用sql语句(7)- order by 对查询结果进行排序

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 通过select出来的结果集是按表中的顺序来排序 ...

随机推荐

  1. CocoaPods安装以及相关问题解决

    Mac OS X上安装 Ruby环境 安装RVM $ curl -L https://get.rvm.io | bash -s stable 关闭终端,新开另外一个终端(新打开的终端会自动载入RVM环 ...

  2. js实现选项卡

    通过JavaScript实现如上选项卡切换的效果. 实现思路: 一.HTML页面布局 选项卡标题使用ul..li 选项卡内容使用div 二.CSS样式制作 整个选项卡的样式设置 选项卡标题的样式设置 ...

  3. MongoDB - The mongo Shell&comma; Configure the mongo Shell

    Customize the Prompt You may modify the content of the prompt by setting the variable prompt in the  ...

  4. Linux挂载60T存储

    操作系统: CentOS 6.3 存储:总大小为72T,并划分成3个块,每块20T 安装多实例MySQL数据库,不想挂载3个块,弄成一个大的比较方便管理,个人比较懒. 配置多路径:http://blo ...

  5. HDU 4539 郑厂长系列故事——排兵布阵

    http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Others) ...

  6. Esper系列&lpar;八&rpar;Method Definition、Schema

    Method Definition 作用:以公共静态方法的方式去访问外部数据.   应用说明: 1.返回数据的方法必须是公共静态方法(方法参数可以有多个也可以没有): 2.如果返回一条数据或无返回数据 ...

  7. 计数排序(O&lpar;n&plus;k&rpar;的排序算法,空间换时间)

    计数排序就是利用空间换时间,时间复杂度O(n+k) n是元素个数,k是最大数的个数: 统计每个数比他小的有多少,比如比a[i]小的有x个,那么a[i]应该排在x+1的位置 代码: /* * @Auth ...

  8. MongoDB 创建索引的语法

    1.为普通字段添加索引,并且为索引命名 db.集合名.createIndex( {"字段名": 1 },{"name":'idx_字段名'}) 说明: (1)索 ...

  9. sciense

    I hate the word "networking." It must be one of the most overused words in the English lan ...

  10. Cannot load php5apache2&lowbar;4&period;dll into server

    配置PHP开发环境的时候,当进行到在Apache的httpd.conf文件中配置加载PHP模块时发生如下错误 httpd: Syntax error on line 185 of D:/wamp/Ap ...