對應的第一章」單錶查詢「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...