栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

查询语句 子查询 in/exists 子查询

查询语句 子查询 in/exists 子查询

查询语句 子查询 in/exists 子查询 前言
  • 子查询在我们查询方法中是比较常用的,通过子查询可以实现多表查询
  • 子查询是指:将一个查询语句嵌套在另一个查询语句中
  • 子查询可以在 select ,update,delete 语句中使用,还可以进行多层嵌套
子查询的语法格式
WHERe <表达式> <操作符> (子查询)

语法格式说明

  • 操作符可以是比较运算符,in,not in,exists,not exists
  • not 当然就是取反了
in 和 exists的一个比较
inexists
当表达式与子查询返回的结果集中的某个值相等时,返回 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 表 查询 dept_ 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)也可以完成
  • 一般来说,表连接(内连接,外连接等)都可以通过子查询查询,但反过来却不一定,有的子查询不能用表连接来替换
  • 子查询比较灵活,适合作为查询的筛选条件
  • 表连接更适合查看连接表之后的数据集
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/336204.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号