第二章 shanzm [TOC] 第二章 查詢結果排序 2.1 以指定順序返回查詢結果 問題: 你想顯示部門編號為 10 的員工的名字、職位和工資,並根據工資從低到高排序。 解決方案: 使用 代碼如下: 當然你可以使用多欄位排序 比如先按照sal升序排序,然自後按照入職日期降序排列 【註意】 1. ...
目錄
第二章 shanzm第二章 查詢結果排序
2.1 以指定順序返回查詢結果
問題:
你想顯示部門編號為 10 的員工的名字、職位和工資,並根據工資從低到高排序。
解決方案:
使用order by column_Name
代碼如下:
select ename,job,sal,hiredate
from emp
where deptno = 10
order by sal asc
當然你可以使用多欄位排序
比如先按照sal升序排序,然自後按照入職日期降序排列
select ename,job,sal,hiredate
from EMP
where deptno = 10
order by sal asc,hiredate desc
【註意】
order by
預設是升序,即ASC
- 降序則使用
DESC
- 在同時使用 ORDER BY 和 WHERE 子句時,應該讓 ORDER BY 位於
WHERE 之後,否則將會產生錯誤
2.2 依據子串排序
問題:
按照一個字元串的特定部分排列查詢結果。
例如:
希望從 EMP 表檢索10號部門的員工的名字和職位,並且按照職位欄位的最後兩個字元對檢索結果進行排序。
解決方案:
在 order by
子句里使用 substring()
函數。
代碼如下:
select ename,job
from EMP
where deptno=10
order by substring(job,len(job)-2,2)
結果:
ename | job |
---|---|
KING | PRESIDENT |
MILLER | CLERK |
CLARK | MANAGER |
【分析】
substring()
函數
第一個參數:字元串所在列的列名
第二個參數:取子串的開始位置
第三個參數:所取的子串的長度
2.3 排序時對 Null 值的處理
問題:
排序依據的列中有null,把該列的值為null的行放在最後
例如:你想按照 EMP 表的 COMM 列對查詢結果進行排序,但該欄位可能為 Null 。非 Null 值以升序排列或降序排列,把全部 Null 值都放到最後面
解決方案:
使用 CASE 表達式來動態調整排序項。
代碼下:
select ename,sal,comm
from
(
select ename,sal,comm,
case when comm is null then 0
else 1
end as is_null
from emp
)X
order by is_null desc,comm
結果如下:
ename | sal | comm |
---|---|---|
TURNER | 1500 | 0 |
ALLEN | 1600 | 300 |
WARD | 1250 | 500 |
MARTIN | 1250 | 1400 |
BLAKE | 2850 | NULL |
CLARK | 2450 | NULL |
SCOTT | 3000 | NULL |
KING | 5000 | NULL |
ADAMS | 1100 | NULL |
JAMES | 950 | NULL |
FORD | 3000 | NULL |
MILLER | 1300 | NULL |
JONES | 2975 | NULL |
SMITH | 800 | NULL |
此處你得想明白,這裡面的子查詢表X,都是臨時的,其中is_null就是一個輔助列,我們按照這個列來排序。
其中子查詢:
select ename,sal,comm,
case when comm is null then 0
else 1
end as is_null
from emp
結果如下:
ename | sal | comm | is_null |
---|---|---|---|
SMITH | 800 | NULL | 0 |
ALLEN | 1600 | 300 | 1 |
WARD | 1250 | 500 | 1 |
JONES | 2975 | NULL | 0 |
MARTIN | 1250 | 1400 | 1 |
BLAKE | 2850 | NULL | 0 |
CLARK | 2450 | NULL | 0 |
SCOTT | 3000 | NULL | 0 |
KING | 5000 | NULL | 0 |
TURNER | 1500 | 0 | 1 |
ADAMS | 1100 | NULL | 0 |
JAMES | 950 | NULL | 0 |
FORD | 3000 | NULL | 0 |
MILLER | 1300 | NULL | 0 |
【註意】
此例在 FROM 子句里用到了內嵌視圖(即子查詢)。
ANSI SQL 標準規定要給它們取別名。
(只有 Oracle 不要求指定這一類別名。)因此,我在解決方案里經常用類似 X 和 Y 這樣的別
名來標識內嵌視圖。
註意最後緊挨著圓括弧的字母 X 。
在這裡,字母 X 變成了 FROM 子句里那個子查詢返回的表的名字。
列別名是一個有用的工具,能幫我們寫出自註釋的代碼;
相對而言,(本書中出現過的多數)內嵌視圖的別名只是一種形式化的東西。
通常我會為它們取一個簡單的名字,諸如 X 、 Y 、 Z 、 TMP1 和 TMP2 。
2.4 依據條件邏輯動態調整排序項
問題:
你希望按照某個條件邏輯來排序。
例如:
如果 job 等於 salesman ,就要按照 comm 來排序;否則,按照 SAL 排序
解決方案1:
在 order by
子句里使用 case
表達式。
代碼下:
select ename,sal,job,comm
from emp
order by
case when job = 'SALESMAN' then comm
else sal
end
【註意】case
子句還可以在select
句中使用。
你可記否?在select
子句中時,case
子句的end
子句的最後要使用as
定義一個列名
記住了,不論在哪,case
子句的基礎格式都是:
case when condition1 then return_value1
case when condition2 then return_value2
else return_default_value
end
解決方案2:構造輔助列
註意case語句的返回值。
select ename,sal,job,comm,
case when job = 'SALESMAN' then comm
else sal
end as ordered
from emp
order by ordered