SQL中 exists和in的区别是什么
发布时间:2014-06-23 22:58:27 来源:51推一把
【摘要】用EXISTS替代IN、用NOT EXISTS替代NOT IN许多基于基础表查询,了满足条件,往往需要对另表进行联接.种情况下, 使用EXISTS(或NOT EXISTS)通常提高查询效率. 子查询,NOT IN子句执行内部排序和合并. 无论哪种情况下,NOT IN都低效 (因对子查询表执行了全表遍历). 了避免使用NO
用EXISTS替代IN、用NOT EXISTS替代NOT IN
许多基于基础表查询,了满足条件,往往需要对另表进行联接.种情况下, 使用EXISTS(或NOT EXISTS)通常提高查询效率. 子查询,NOT IN子句执行内部排序和合并. 无论哪种情况下,NOT IN都低效 (因对子查询表执行了全表遍历). 了避免使用NOT IN ,我们把改写成外连接(OUTER JOINS)或NOT EXISTS.
例子:(高效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB’)
(低效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB’)
12. 用EXISTS替换DISTINCT
当提交包含对多表信息(比部门表和雇员表)查询时,避免SELECT子句使用DISTINCT. 般考虑用EXIST替换, EXISTS 使查询更迅速,因RDBMS核心模块子查询条件旦满足,立刻返回结
例:(低效): SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E WHERE D.DEPT_NO = E.DEPT_NO
(高效): SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);
许多基于基础表查询,了满足条件,往往需要对另表进行联接.种情况下, 使用EXISTS(或NOT EXISTS)通常提高查询效率. 子查询,NOT IN子句执行内部排序和合并. 无论哪种情况下,NOT IN都低效 (因对子查询表执行了全表遍历). 了避免使用NOT IN ,我们把改写成外连接(OUTER JOINS)或NOT EXISTS.
例子:(高效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB’)
(低效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB’)
12. 用EXISTS替换DISTINCT
当提交包含对多表信息(比部门表和雇员表)查询时,避免SELECT子句使用DISTINCT. 般考虑用EXIST替换, EXISTS 使查询更迅速,因RDBMS核心模块子查询条件旦满足,立刻返回结
例:(低效): SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E WHERE D.DEPT_NO = E.DEPT_NO
(高效): SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);