天天看點

【sql查詢與優化】2.給查詢結果排序

注:以下所有sql案例均取自"oracle查詢優化改寫技巧與案例"叢書。

emp表的詳細:

【sql查詢與優化】2.給查詢結果排序

查詢所有資訊,

     empno ename                job                       mgr hiredate       sal        comm       deptno

---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------

      1110 張三                 主管                     3322 12-3月 -14      5200                    20

      1111 李四                 銷售                     3321 03-11月-15      3400        500         30

      1112 王五                 銷售                     3321 25-4月 -12      4400        800         30

      1113 趙二                 後勤                     3320 30-5月 -11      3450                    40

      1114 李磊磊               會計                     3319 22-12月-15      2500                    50

      1115 張少麗               銷售                     3321 11-3月 -16      3400       1400         30

      1116 林建國               主管                     3322 22-1月 -16      5700                    20

      1117 馬富邦               後勤                     3320 22-7月 -13      2800                    40

      1118 沈倩                 會計                     3319 06-5月 -10      2100                    50

已選擇9行。

1.以指定的次序傳回查詢結果

實際提取資料或生産報表時,一般都要根據一定的順序檢視,比如,想檢視機關所雇員工的資訊。

     empno ename                hiredate

---------- -------------------- --------------

      1110 張三                 12-3月 -14

      1116 林建國               22-1月 -16

上面除了“order by hiredate asc”的寫法外,還可以寫成“order by 3 asc”,意思是按第三列排序。

當取值不定時,用這種方法就很友善,比如,有時取sal,有時要取comm來顯示:

     empno ename                       sal

---------- -------------------- ----------

      1110 張三                       5200

      1116 林建國                     5700

     empno ename                      comm

      1111 李四                        500

      1112 王五                        800

      1115 張少麗                     1400

注意:用資料來代替列位置隻能用于order by子句中,其他地方都不能用。

2.按多個字段排序

要求:按部門編号升序,并按工資降序排列

排序時有兩個關鍵字:asc表示升序,desc表示降序

     empno     deptno        sal ename                job

---------- ---------- ---------- -------------------- ------------------

      1116         20       5700 林建國               主管

      1110         20       5200 張三                 主管

      1112         30       4400 王五                 銷售

      1111         30       3400 李四                 銷售

      1115         30       3400 張少麗               銷售

      1113         40       3450 趙二                 後勤

      1117         40       2800 馬富邦               後勤

      1114         50       2500 李磊磊               會計

      1118         50       2100 沈倩                 會計

對于重複值的排序,原理就是把資料分成了幾組,然後每組的資料再去排序。

3.按子串排序

使用員工号尾号(最後兩位)速查員工可以很快查到,當然也可以使用縮減的子串進行排序。

員工号尾号           deptno        sal ename                job

---------------- ---------- ---------- -------------------- ------------------

10                       20       5200 張三                 主管

11                       30       3400 李四                 銷售

12                       30       4400 王五                 銷售

13                       40       3450 趙二                 後勤

14                       50       2500 李磊磊               會計

注:substr(expr,number)是字元串截取函數

4.字元串一一替換函數translate

文法格式:translate(expr,from_string,to_string)

示例:

new_str

----------------------------------

12 你好 2314567

from_string與to_string以字元為機關,對應字元一一替換。

【sql查詢與優化】2.給查詢結果排序

如果to_string對應的位置沒有字元,from_string中列出的字元也将會被消掉。

----------------

 你好

原因

【sql查詢與優化】2.給查詢結果排序

5.按數字和字母混合字元串中的字母排序

首先建立view如下:

data

1110 張三

1111 李四

1112 王五

1113 趙二

1114 李磊磊

1115 張少麗

1116 林建國

1117 馬富邦

1118 沈倩

現在隻有一個字段data,裡面就是數字+空格+字母的組合,要求我們用data中的字母(也就是原來的ename)排序。

data          ename 

------------- -------------

1117 馬富邦   馬富邦

1113 趙二     趙二

1112 王五     王五

1118 沈倩     沈倩

1116 林建國   林建國

1114 李磊磊   李磊磊

1111 李四     李四

1115 張少麗   張少麗

1110 張三     張三

6.處理排序空值

oracle預設排序空值在後面,想把空值放前,以前的做法是nvl(comm,-1)

ename                       sal       comm  order_col

-------------------- ---------- ---------- ----------

張三                       5200                    -1

李磊磊                     2500                    -1

馬富邦                     2800                    -1

林建國                     5700                    -1

趙二                       3450                    -1

沈倩                       2100                    -1

李四                       3400        500        500

王五                       4400        800        800

張少麗                     3400       1400       1400

nvl(comm,-1)這種做法需要對列類型及其中儲存的資料有所了解才行,而且儲存的資料如果有變化,該語句就要重新維護。

其實可以用關鍵字nulls first和nulls last。

(1)空值在前

ename                       sal       comm

-------------------- ---------- ----------

張三                       5200

李磊磊                     2500

馬富邦                     2800

林建國                     5700

趙二                       3450

沈倩                       2100

李四                       3400        500

王五                       4400        800

張少麗                     3400       1400

(2)空值在後

7.根據條件取不同列中的值來排序

有時排序的要求會比較複雜,比如:上司對工資在2000到3000元之間的員工更感興趣,于是要求工資在這個範圍的員工要排在前面,便于優先檢視。

我們可以在查詢中新生成一列,用多列排序的方法處理:

      編碼 姓名                       級别       工資

---------- -------------------- ---------- ----------

      1118 沈倩                          1       2100

      1114 李磊磊                        1       2500

      1117 馬富邦                        1       2800

      1115 張少麗                        2       3400

      1111 李四                          2       3400

      1113 趙二                          2       3450

      1112 王五                          2       4400

      1110 張三                          2       5200

      1116 林建國                        2       5700

也可以不顯示級别,直接把case when 放在 order by中:

      編碼 姓名                       工資

      1118 沈倩                       2100

      1114 李磊磊                     2500

      1117 馬富邦                     2800

      1115 張少麗                     3400

      1111 李四                       3400

      1113 趙二                       3450

      1112 王五                       4400

轉載請注明出處:http://blog.csdn.net/acmman/article/details/51038665