t2 数据量巨大且索引情况不好(大量重复值等),则不宜使用产生对 t2 的 DISTINCT 检索而导致系
统开支巨大的 IN 操作,反之当 t1 表数据量巨大(不受索引影响)而 t2 表数据较少且索引良好则不宜
使用引起 t1 全表扫描的 EXISTS 操作。
通常 EXISTS 比 IN 快。
EXISTS 只返回 TRUE 和 False,不返回列表的值。
EXISTS 先查外表再判断内查询,IN 先执行内查询再进行外表查询
EXISTS 断是否有记录,IN 判断一个字段是否存在于几个值的范围中
5.9使用 IN 代替 OR.
5.10使用>=代替>
5.11使用 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 WHEREEXISTS( SELECT ‘X‘
FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);
5.12使用表连接替换 EXIST 或 IN
说明:使用表连接比使用 EXIST 或 IN 更有效率。
×SELECT ENAME FROM EMP E WHERE EXISTS (SELECT ‘X' FROM DEPT WHERE
DEPT_NO = E.DEPT_NO AND DEPT_CAT = ‘A');
○SELECT ENAME FROM DEPT D,EMP E WHERE E.DEPT_NO = D.DEPT_NO AND
DEPT_CAT = ‘A' ;
5.13 WHERE 语句中不要使用 NOT IN
说明:在子查询中,NOT IN 子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN 都是最
低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用 NOT IN ,我们可以把它改写成
外连接(Outer Joins)或 NOT EXISTS.
×SELECT ⋯FROM EMP WHERE DEPT_NO NOT IN (SELECT DEPT_NO
FROM DEPT WHERE DEPT_CAT = ‘A’);