mysql EXISTS() 替代in 作者:马育民 • 2021-08-19 23:04 • 阅读:10898 # 说明 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