Oracle查詢優化改寫 1

2021-08-21 09:49:29 字數 1777 閱讀 9610

對應的第一章」單錶查詢「

1.將空值轉換為實際值

和nvl函式相比,coalesce函式更好用,後者支援多個引數。

coalesce

語法:coalesce(exp1,exp2,exp3,...)

功能:9i新增,依次查詢各引數,遇到非null則返回,各引數或表示式資料型別必須一致,如果都為null則返回null

如果nvl要實現相同的功能,則需要巢狀多層。

select nvl(nvl(ex1,ex2),ex3) as ex from dual;
2.在where子句中引用取別名的列

引用別名時候需要巢狀一層,別名是在select之後才有效的。

select * from (select sal as 工資,comm as 提成 from emp) e where 工資 < 1000;

如果為巢狀,像下面的sql一樣,則會報錯

select sal as 工資,comm as 提成 from emp where 工資 < 1000;

==報錯:「工資」識別符號無效。==

3.限制返回行數

使用偽劣rownum來過濾,rownum依次對返回的每一條資料做乙個標識。

select * from emp where rownum <= 2;
如果使用rownum = 2,此時查詢失敗。因為rownum是依次對資料做標識的,即需要有第一,才能有第二,所以需要把所有的資料取出來才可以確定第二行。

正確的取第二行資料的查詢sql應該為:

select * from (select rownum as rn ,emp.* from emp where rownum <= 2) where rn = 2;
4.從表中隨機返回n條記錄

先寫出來正確的sql:

select empno,empname 

from(select empno,empname from emp order

by dbms_random.value())

where rownum <= 3;

此時會有疑問,為什麼要巢狀一層呢?

下面的sql不就可以了?

==錯誤示例==

select empno,empname from emp where rownum <= 3

order

by dbms_random.value;

多執行幾次上述sql,發現查出來的結果,每次都是一樣的,而不是隨機的。

這是因為錯誤的示例,sql執行順序是

①select

②rownum

③order by

也就是說,錯誤的示例是先取出資料,生成序號,最後才排序的。

正確的查詢方法,應該是:先隨機排序,再取出資料。

5.模糊查詢

%:零個或多個任意字元

_:單個任意字元

1)查詢包含字串」_bcd」

此時查詢條件為: like 『%_bcd%』 escape 『\』

==++escape++把』\』標識為轉義字元,而』\』把』_』轉義為字元,而非其原義(萬用字元)==

2)查詢包含字串①」_\bcd」 ②」%bcd」

此時查詢條件為: ①like 『%_\bcd%』 escape 『\』 ②like 『%\%bcd%』 escape 『\』

Oracle查詢優化改寫 2

對應的第二章 給查詢結果排序 1.按指定列排序select ename,comm from emp order by comm asc select ename,comm from emp orderby2 asc 按照第二列排序2.translate函式語法 translate string,fr...

Oracle 查詢優化器 改寫查詢語句

start 當我們執行一條查詢語句的時候,我們只告訴 oracle 我們想要哪些資料,至於資料在 怎麼找,那是查詢優化器的事情,優化器需要改寫查詢語句,決定訪問路徑 如 全表掃瞄,快速全索引掃瞄,索引掃瞄 決定表聯接順序等。至於選擇哪種方式,優化器需要根據資料字典做出判斷。那優化器如何改寫查詢語句呢...

Oracle查詢優化改寫 抄書學習02

3.10 聚集和內連線 員工獎金根據type計算,type 1 的為10 type 2 的wei20 以此類推 先把獎金跟員工彙總,在於員工表關聯。select e.deptno sum e.sal as total sal sum e.sal eb2.rate as total bonus fro...