mysql EXISTS() 替代in

说明

EXISTS()用于检查子查询是否至少会返回一行数据,该子查询实际上并 不返回任何数据,而是 返回值True或False

EXISTS 指定一个子查询,检测 的存在。

简单例子1

select * from emp where exists(select 0)
  1. 执行子查询 select 0 ,会返回一条记录 0,那么表示 行 存在
  2. 所以 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)
  1. 执行子查询 select 0 from dept where 1=2 ,没有记录
  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 
)
  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. 然后 取出 外查询 下一行记录,传给内查询,继续上面 2、3

原文出处:http://malaoshi.top/show_1IX1hsc00ErT.html