** 17. ** ** 使用表的别名 (Alias) **
当在 SQL 语句中连接多个表时 , 请使用表的别名并把别名前缀于每个 Column 上 . 这样一来 , 就可以减少解析的时间并减少那些由 Column 歧义引起的语法错误 .
** ( ** ** 译者注 : Column ** ** 歧义指的是由于 SQL ** ** 中不同的表具有相同的 Column ** ** 名 , ** ** 当 SQL ** ** 语句中出现这个 Column ** ** 时 ,SQL ** ** 解析器无法判断这个 Column ** ** 的归属 ) **
** 18. ** ** 用 EXISTS ** ** 替代 IN **
在许多基于基础表的查询中 , 为了满足一个条件 , 往往需要对另一个表进行联接 . 在这种情况下 , 使用 EXISTS( 或 NOT EXISTS) 通常将提高查询的效率 .
低效 :
SELECT *
FROM EMP ( 基础表 )
WHERE EMPNO > 0
AND DEPTNO IN (SELECT DEPTNO
FROM DEPT
WHERE LOC = ‘MELB’)
高效 :
SELECT *
FROM EMP ( 基础表 )
WHERE EMPNO > 0
AND EXISTS (SELECT ‘X’
FROM DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
AND LOC = ‘MELB’)
** ( ** ** 译者按 : ** ** 相对来说 , ** ** 用 NOT EXISTS ** ** 替换 NOT IN ** ** 将更显著地提高效率 , ** ** 下一节中将指出 ) **
** 19. ** ** 用 NOT EXISTS ** ** 替代 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’);
为了提高效率 . 改写为 :
( 方法一 : 高效 )
SELECT ….
FROM EMP A,DEPT B
WHERE A.DEPT_NO = B.DEPT(+)
AND B.DEPT_NO IS NULL
AND B.DEPT_CAT(+) = ‘A’
( 方法二 : 最高效 )
SELECT ….
FROM EMP E
WHERE NOT EXISTS (SELECT ‘X’
FROM DEPT D
WHERE D.DEPT_NO = E.DEPT_NO
AND DEPT_CAT = ‘A’); ** **
(待续)