Oracle查詢優化改寫 2

2021-08-21 09:50:33 字數 2089 閱讀 6048

對應的第二章」給查詢結果排序「

1.按指定列排序
select ename,comm from emp order

by comm asc;

select ename,comm from emp orderby2

asc;

--按照第二列排序

2.translate函式
語法:

translate(string,from_str,to_str)

功能:1. from_str和to_str以字元為單位,對應字元一一替換。

2. translate是replace所提供的功能的乙個超集

3. 如果from_str比to_str長,那麼在from_str中而不在to_str中而外的字元將從string中被刪除,因為它們沒有相應的替換字元.

4. to_str不能為空.oracle把空字串認為是null,並且如果translate中的任何引數為null,那麼結果也是null

3.數字和字母混合字串的字母排序

此時可以使用到上述的 translate函式。

select

'7876 andy'

as aname,translate('7876 andy','- 0123456789','-') as ename from dual

4.空值排序的問題

oracle預設排序空值在後面,如果要把空值顯示在前面,如何實現?

首先想到的是 nal,實現如下:

select ename,comm,nvl(comm,-1) order_col from emp order

by3;

上述的sql的確可以實現這個功能。但是,必須關注排序列的資料型別。

其實,可以使用關鍵字

nulls first 和 nulls last
來控制排序時,空值在前還是在後。

select ename,comm from emp order

by2 nulls first;

5.排序的列有條件限制

條件:領導對工資在1000—2000之間的員工更感興趣,再按工資公升序排列。

select empno as 編碼,ename as 姓名,

case

when sal >=1000

and sal < 2000

then

1else

2end

as 級別,

sal as 工資

from emp where deptno = 30

order

by3,4;

結果如下:

編碼姓名

級別工資

7654

martin

11250

7521

ward

11250

7499

allen

11600

7900

james

2950

7698

blake

22850

也可以不顯示級別,把 case when 放到 order by 中

select empno as 編碼,ename as 姓名,

sal as 工資

from emp where deptno = 30

order

bycase

when sal >=1000

and sal < 2000

then

1else

2end, 3;

結果如下:

編碼姓名

工資7654

martin

1250

7521

ward

1250

7499

allen

1600

7900

james

9507698

blake

2850

Oracle查詢優化改寫 1

對應的第一章 單錶查詢 1.將空值轉換為實際值 和nvl函式相比,coalesce函式更好用,後者支援多個引數。coalesce 語法 coalesce exp1,exp2,exp3,功能 9i新增,依次查詢各引數,遇到非null則返回,各引數或表示式資料型別必須一致,如果都為null則返回null...

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...