17. 使用表的別名(alias)
當(dāng)在sql語(yǔ)句中連接多個(gè)表時(shí), 請(qǐng)使用表的別名并把別名前綴于每個(gè)column上.這樣一來(lái),就可以減少解析的時(shí)間并減少那些由column歧義引起的語(yǔ)法錯(cuò)誤.
(譯者注: column歧義指的是由于sql中不同的表具有相同的column名,當(dāng)sql語(yǔ)句中出現(xiàn)這個(gè)column時(shí),sql解析器無(wú)法判斷這個(gè)column的歸屬)
18. 用exists替代in
在許多基于基礎(chǔ)表的查詢中,為了滿足一個(gè)條件,往往需要對(duì)另一個(gè)表進(jìn)行聯(lián)接.在這種情況下, 使用exists(或not exists)通常將提高查詢的效率.
低效:
select *
from emp (基礎(chǔ)表)
where empno > 0
and deptno in (select deptno
from dept
where loc = ‘melb’)
高效:
select *
from emp (基礎(chǔ)表)
where empno > 0
and exists (select ‘x’
from dept
where dept.deptno = emp.deptno
and loc = ‘melb’)
(譯者按: 相對(duì)來(lái)說(shuō),用not exists替換not in 將更顯著地提高效率,下一節(jié)中將指出)
19. 用not exists替代not in
在子查詢中,not in子句將執(zhí)行一個(gè)內(nèi)部的排序和合并. 無(wú)論在哪種情況下,not in都是最低效的 (因?yàn)樗鼘?duì)子查詢中的表執(zhí)行了一個(gè)全表遍歷). 為了避免使用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(chǎn)’
(方法二: 最高效)
select ….
from emp e
where not exists (select ‘x’
from dept d
where d.dept_no = e.dept_no
and dept_cat = ‘a(chǎn)’);
(待續(xù))