Oracle查询优化-02给查询结果排序
- 1以指定的次序返回查詢結果
- 問題
- 解決方案
- 總結
- 2按多個字段排序
- 問題
- 解決方案
- 總結
- 3按子串排序
- 問題
- 解決方案
- 總結
- 4 TRANSLATE
- 語法
- 工具
- 總結
- 5 按數字和字母混合字符串中的字母排序
- 問題
- 解決方案
- 總結
- 6 處理排序空值 - nulls first 和 nulls last
- 問題
- 解決方案
- 總結
- 7 根據條件取不同列中的值來排序
- 問題
- 解決方案
- 總結
2.1以指定的次序返回查詢結果
問題
顯示部門10中的員工姓名、職位、工資,并且按照工資升序排列,結果集如下:
SQL> select a.ename,a.job ,a.sal from emp a where a.deptno=10; ENAME JOB SAL ---------- --------- --------- CLARK MANAGER 2450.00 KING PRESIDENT 5000.00 MILLER CLERK 1300.00解決方案
使用order by 子句
SQL> select a.ename,a.job ,a.sal from emp a where a.deptno=10 order by a.sal asc ;ENAME JOB SAL ---------- --------- --------- MILLER CLERK 1300.00 CLARK MANAGER 2450.00 KING PRESIDENT 5000.00總結
2.2按多個字段排序
問題
在emp表中,首先按照deptno升序排列,然后按照工資降序排列
解決方案
order by子句中列出不同的排序列,使用逗號分隔
SQL> select a.deptno,a.sal from emp a order by a.deptno ,a.sal desc ;DEPTNO SAL ------ ---------10 5000.0010 2450.0010 1300.0020 3000.0020 3000.0020 2975.0020 1100.0020 800.0030 2850.0030 1600.0030 1500.0030 1250.0030 1250.0030 950.0014 rows selectedSQL>總結
2.3按子串排序
問題
按照字符串的某一部分對查詢結果進行排序。
比如從emp中返回員工的名字和職位,并且按照職位字段的最后兩個字符排序。
解決方案
在order by 子句中使用substr函數
SQL> select a.ename, a.job from emp a order by substr ( job, -2); SQL> select a.ename, a.job from emp a order by substr ( job, length(job)-1);SQL> select a.ename, a.job from emp a order by substr ( job, length(job)-1);ENAME JOB ---------- --------- ALLEN SALESMAN MARTIN SALESMAN WARD SALESMAN TURNER SALESMAN BLAKE MANAGER JONES MANAGER CLARK MANAGER KING PRESIDENT SMITH CLERK ADAMS CLERK JAMES CLERK MILLER CLERK SCOTT ANALYST FORD ANALYST14 rows selectedSQL>總結
使用dbms的子串字符,可以很容易的按照字符串的一部分來排序。
2.4 TRANSLATE
語法
TRANSLATE(string,from_str,to_str)工具
總結
SQL> SELECT TRANSLATE('abcdefghij','abcdef','123456') FROM dual; TRANSLATE('ABCDEFGHIJ','ABCDEF ------------------------------ 123456ghijSQL> select translate('abcbbaadef','bad','#@') from dual;TRANSLATE('ABCBBAADEF','BAD',' ------------------------------ @#c##@@efb將被#替代,a將被@替代,d對應的值是空值,將被移走。2.5 按數字和字母混合字符串中的字母排序
問題
現有字母和數字混合的數據,希望按照數字或者字母部分來排序。
數據集 如下:
SQL> create or replace view v as select a.ename|| ' ' ||a.deptno as data from emp a ;View createdSQL> select * from v ;DATA --------------------------------------------------- SMITH 20 ALLEN 30 WARD 30 JONES 20 MARTIN 30 BLAKE 30 CLARK 10 SCOTT 20 KING 10 TURNER 30 ADAMS 20 JAMES 30 FORD 20 MILLER 1014 rows selectedSQL>解決方案
按照 deptno 排序
SQL> select *from vorder by replace(data,replace(translate(data, '0123456789', '##########'),'#',''),'');DATA --------------------------------------------------- CLARK 10 KING 10 MILLER 10 JONES 20 FORD 20 ADAMS 20 SMITH 20 SCOTT 20 WARD 30 TURNER 30 ALLEN 30 JAMES 30 BLAKE 30 MARTIN 3014 rows selectedSQL>按照 ename排序
SQL> select *from vorder by replace(replace(translate(data, '0123456789', '##########'),'#',''),'');DATA --------------------------------------------------- ADAMS 20 ALLEN 30 BLAKE 30 CLARK 10 FORD 20 JAMES 30 JONES 20 KING 10 MARTIN 30 MILLER 10 SCOTT 20 SMITH 20 TURNER 30 WARD 3014 rows selectedSQL>總結
translate和replace函數從每一行中去掉數字或者字符,這樣就很容易的可以根據具體情況來排序。
2.6 處理排序空值 - nulls first 和 nulls last
問題
emp表中comm字段,這個字段可以為空,需要指定是否將空值排在最后 或者將空值排在最前。
解決方案
oracle9i以后 可以使用關鍵字 nulls first 和 nulls last 來確保null是首先排序還是最后排序,而不必考慮非空值的排序方式。
SQL> select ename ,comm from emp order by comm desc nulls first;ENAME COMM ---------- --------- SMITH CLARK FORD JAMES ADAMS JONES BLAKE MILLER SCOTT KING MARTIN 1400.00 WARD 500.00 ALLEN 300.00 TURNER 0.0014 rows selectedSQL> select ename ,comm from emp order by comm desc nulls last;ENAME COMM ---------- --------- MARTIN 1400.00 WARD 500.00 ALLEN 300.00 TURNER 0.00 SCOTT KING ADAMS JAMES FORD MILLER BLAKE JONES SMITH CLARK 14 rows selectedSQL>總結
oracle9i以后 可以使用關鍵字 nulls first 和 nulls last 來確保null是首先排序還是最后排序,而不必考慮非空值的排序方式。
2.7 根據條件取不同列中的值來排序
問題
要根據某些條件邏輯來排序,比如 job是saleman的要根據comm排序,否則按照sal排序,降序排列
解決方案
在order by 子句中使用case表達式
SQL> select ename, job, sal, commfrom emporder by case when job = 'SALESMAN' thencomm elsesal end desc;ENAME JOB SAL COMM ---------- --------- --------- --------- KING PRESIDENT 5000.00 FORD ANALYST 3000.00 SCOTT ANALYST 3000.00 JONES MANAGER 2975.00 BLAKE MANAGER 2850.00 CLARK MANAGER 2450.00 MARTIN SALESMAN 1250.00 1400.00 MILLER CLERK 1300.00 ADAMS CLERK 1100.00 JAMES CLERK 950.00 SMITH CLERK 800.00 WARD SALESMAN 1250.00 500.00 ALLEN SALESMAN 1600.00 300.00 TURNER SALESMAN 1500.00 0.0014 rows selectedSQL>總結
可以使用CASE表達式來動態改變如何對結果排序。 傳遞給order by 的值類似這樣:
select ename, job, sal, comm,case when job = 'SALESMAN' thencomm elsesal end as ordered_col from emp order by ordered_col desc ;或者
select ename, job, sal, comm,case when job = 'SALESMAN' thencomm elsesal end as ordered_col from emp order by 5 desc ;總結
以上是生活随笔為你收集整理的Oracle查询优化-02给查询结果排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle查询优化-01单表查询
- 下一篇: Oracle查询优化-03操作多个表