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’);
当在 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’);