SQL中EXISTS理解使用

SQL中EXISTS的理解使用

关联子查询

  • 在讲述EXISTS用法之前,先讲述一下关联子查询:
    关联子查询:是指在内查询中需要借助于外查询,而外查询离不开内查询的执行。

举个栗子:
在Oracle中自带的EMP表中,查询工资大于同职位平均工资的员工信息

  • EMP表:

在这里插入图片描述

  • Oracle语句:
select * from emp e
where sal >(select avg(sal) from emp where job = e.job);
  1. 首先执行外查询 select * from emp e,然后取出第一行数据,将数据中的JOB传递给内查询
  2. 内查询(select avg(sal) from emp where job = e.job) 根据外查询传递的JOB来查询平均工资,此时相当于select avg(sal) from emp where job = ‘CLERK’;
  3. 外查询取出的第一行数据比较sal是否大于内查询查出的平均工资,若大于,则保留改行作结果显示,反之则不保留
  4. 依次逐行查询、比较、是否保留;类似Java的for循环一样

执行结果:
在这里插入图片描述

EXISTS理解使用

EXISTS (subquery)
如果子查询包含任何行,则EXISTS运算符返回true。 否则它返回false。

用exists代替in是SQL性能优化的一个手段,使用exists能提高查询性能

举个栗子:
Oracle自带的EMP、DEPT表查询,部门编号小于30的所有员工信息

  • Oracle语句:
select * from emp where deptno in (select deptno from dept where deptno <30);

select * from emp e where exists (
	select * from dept d where  deptno <30 and d.deptno = e.deptno ;
);
  1. 首先执行外查询 select * from emp e,然后取出第一行数据,将数据中的部门编号传给内查询
  2. 内查询执行select * from dept d where deptno <30 and d.deptno = e.deptno ;看是否查询到结果,查询到,则返回true,否则返回false;比如传来的是30,则不满足deptno <30 and d.deptno = 30,返回false
  3. 内查询返回true,则该行数据保留,作为结果显示;反之,返回false,则不作结果显示
  4. 逐行查询看内查询是否查到数据,是否保留作结果显示

如果上述内查询为: select * from dept d where deptno <30
因为该语句都会查询到有结果,每一行都返回true,所以会查询到的是全部员工信息

查询结果:

在这里插入图片描述

not exists:子查询查询到有结果则返回false,没有查询到结果返回true
如下述语句,查询到的是deptno = 30 的员工信息(dept表只有10,20,30)

select * from emp e where not exists (
	select * from dept d where  deptno <30 and d.deptno = e.deptno ;
);

注意:exists子查询查找到有结果则返回true,即使子查询查到的内容为null,也返回true

个人学习理解,互相学习,互相指正!

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页