说明
EXISTS()用于检查子查询是否至少会返回一行数据,该子查询实际上并 不返回任何数据,而是 返回值True或False
EXISTS 指定一个子查询,检测 行 的存在。
简单例子1
select * from emp where exists(select 0)
- 执行子查询
select 0
,会返回一条记录0
,那么表示 行 存在 - 所以
exists(select 0)
返回true
就相当于下面语句:
select * from emp where true
那么相当于下面语句:
select * from emp
简单例子2
select * from emp where exists(select 0 from dept where 1=2)
- 执行子查询
select 0 from dept where 1=2
,没有记录 - 所以
exists(select 0)
返回 false
就相当于下面语句:
select * from emp where false
所以没有记录
exists VS in
exists代替in是SQL性能优化的一个手段,使用exists能提高查询性能
例子
EMP、DEPT表查询,部门编号小于30的所有员工信息
in写法:
select * from emp where deptno in (select deptno from dept where deptno <30);
exists写法:
select * from emp e where exists (
select * from dept d where deptno <30 and d.deptno = e.deptno
)
- 首先执行外查询
select * from emp e
,然后取出第一行数据,将数据中的部门编号传给内查询 - 内查询执行
select * from dept d where deptno <30 and d.deptno = e.deptno
看是否查询到结果,查询到,则返回true,否则返回false;
比如传来的是30,则不满足deptno <30 and d.deptno = 30
,返回false - 内查询返回true,则该行数据保留,作为结果显示;反之,返回false,则不作结果显示
- 然后 取出 外查询 下一行记录,传给内查询,继续上面 2、3