日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle查询优化-02给查询结果排序

發布時間:2025/3/21 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

  • 使用order by子句可以對結果集進行排序。 默認情況下 升序排列,因此asc是可選的, 降序排列使用desc.
  • . 不一定要指定排序所基于的列名,也可以給出這列的編號, 編號從1開始。
  • SQL> select a.ename,a.job ,a.sal from emp a where a.deptno=10 order by 3 ;ENAME JOB SAL ---------- --------- --------- MILLER CLERK 1300.00 CLARK MANAGER 2450.00 KING PRESIDENT 5000.00
  • 用數字來代替列位置只能用于order by 子句中,其他地方都不能用。

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

    總結

  • 多列排序時,若前面的列有重復值,后面的排序才有用,相當于是通過前面的列把數據分成了幾組,然后每組的數據再按照后面的列進行排序。
  • 在order by中,優先順序是從左到右。 如果在select列表中使用的數字位置排序,那么這個數值不能大于select列表中項目的數目。
  • 一般情況下都可以按照select列表中沒有的列來排序,但必須顯示的給出排序的列名。
  • 如果在查詢中使用group by 或者distinct,則不能按照select列中

  • 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)

    工具

  • 返回將(所有出現的)from_str中的每個字符替換為to_str中的相應字符以后的string。
  • TRANSLATE 是 REPLACE 所提供的功能的一個超集。如果 from_str 比 to_str 長,那么在 from_str 中而不在 to_str 中的額外字符將從 string 中被刪除,因為它們沒有相應的替換字符。to_str 不能為空。
  • Oracle 將空字符串解釋為 NULL,并且如果TRANSLATE 中的任何參數為NULL,那么結果也是 NULL。
  • 總結

    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给查询结果排序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。