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

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

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

 

前言

 

查询的语法格式

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

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

<> (= "销售部")

 

in 的栗子

sql分析

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

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

="销售部"

最终的 sql 其实是这样的

in (1,3)

 

not in 的栗子

not ="销售部")

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

 

exists 栗子

sql分析

  • 从 dept 表中查询 id = 1 的记录,若有,exists 表达式则返回True
  • 外层查询语句接收到 True 之后,对 emp 表进行查询,返回所有记录
where exists(where id = 1)

可以看看 exists 表达式里的子查询结果集

1

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

最终的 sql 其实是这样的

where true

 

exists + 其他查询条件的栗子

exists (1) and dept_id 2

 

知识点

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

相关文章

优化MySQL数据库发布系统存储的方法有:1.mysql库主从读写分...
使用mysql的方法:在“我的电脑”→右键→“管理”→“服务”...
在mysql中查看root用户权限的方法:1.命令行启动mysql服务;...
MySQL主从复制是用来备份一个与主数据库一样环境的从数据库,...
运行mysql的方法1.启动mysql服务,在“我的电脑”→右键→“...
开启mysql的方法1.可以通过快捷键win+r,输入cmd,打开窗口,...