Oracle排序


在本教學中將學習如何使用Oracle ORDER BY子句來按升序或降序對一列或多列的結果集進行排序。

Oracle ORDER BY子句簡介

在Oracle中,表中是以非指定順序儲存行資料記錄的,它不管行插入資料庫的順序如何。要按列以升序或降序查詢行記錄,必須明確指示Oracle資料庫要如何去排序。

例如,您可能希望按名稱的字母順序列出所有客戶,或者按照從最低到最高信用限額的順序顯示所有客戶。

要對資料進行排序,請按如下方式將ORDER BY子句新增到SELECT語句中,參考以下語法:

SELECT
    column_1,
    column_2,
    column_3,
    ...
FROM
    table_name
ORDER BY
    column_1 [ASC | DESC] [NULLS FIRST | NULLS LAST],
    column_1 [ASC | DESC] [NULLS FIRST | NULLS LAST],

要按列排序結果集,可以在ORDER BY子句之後列出該列。

按照列名是一個排序順序,可以是:

  • ASC表示按升序排序
  • DESC表示按降序排序

預設情況下,無論是否指定ASCORDER BY子句都按升序對行進行排序。如果要按降序對行進行排序,請明確使用DESC

NULLS FIRST在非NULL值之前放置NULL值,NULLS LAST在非NULL值之後放置NULL值。

ORDER BY子句可以按多列對資料進行排序,每列可能有不同的排序順序。

請注意,ORDER BY子句總是SELECT語句中的最後一個子句。

Oracle ORDER BY子句的例子

下面將使用範例資料庫中的customers表進行演示。

以下語句從客戶(customers)表中檢索客戶的:name, addresscredit limit

SELECT name, address, credit_limit FROM customers;

執行上面查詢語句,得到以下結果 -

正如截圖中所看到的,行記錄的順序是未指定的。

1. 按列排序行範例

要按照字母順序按升序排列客戶名稱,請使用以下語句:

SELECT name,address,credit_limit
FROM customers
ORDER BY name ASC;

執行上面範例程式碼,得到以下結果 -

ASC指示Oracle按升序對行進行排序。但是ASC是可選的,如果省略,則在預設情況下,ORDER BY子句按指定的列按升序對行進行排序。

因此,下面的表示式:

ORDER BY name ASC

等效於 -

ORDER BY name

要按字母順序降序排列客戶名稱,請在ORDER BY子句中的列名之後顯式使用DESC,如下所示:

SELECT name, address, credit_limit
FROM customers
ORDER BY name DESC;

執行上面查詢語句,得到以下結果 -

2. 按多個列排序行範例

要對多列進行排序,可以用逗號分隔ORDER BY子句中的每列。

請參閱範例資料庫中的以下聯絡人(contacts)表。

例如,要按first_name進行按升序排序,並按降序對last_name列進行排序,請使用以下語句:

SELECT first_name, last_name
FROM contacts
ORDER BY first_name, last_name DESC;

執行上面範例程式碼,可以看到如下結果 -

從上面截圖中可以看到,contact_id91311這兩條記錄的first_name的值相同,last_name的值是以降序來排列的。

在這個例子中,Oracle首先按first_name升序對行進行排序,以建立初始結果集。 然後Oracle按降序對last_name排序初始結果集。

看到類似下面的結果如下:

在上面的這個結果中:

  • 首先,按first_name升序排序。
  • 其次,如果兩個名字相同,按last_name降序排列,如Daniel GlassDaniel CostnerDianne SenDianne DerekDoretha TylerDorotha Wong

3. 按列位置排序行範例

不需要指定用於排序資料的列名稱。如果您願意,可以使用ORDER BY子句中列的位置。

請參考下語句 -

SELECT name, credit_limit,address
FROM customers
ORDER BY 2 DESC, 1;

在這個例子中,name列的位置是1credit_limit列的位置是2。相當於以下查詢語句 -

SELECT name, credit_limit,address
FROM customers
ORDER BY credit_limit DESC, name;

ORDER BY子句中,使用這些列位置來指示Oracle對行進行排序。

4.用NULL值排序行的範例

請參閱範例資料庫中的以下地區(locations)表:

以下語句按城市(city)和州(state)檢索位置並對其進行排序:

SELECT country_id, city, state
FROM locations 
ORDER BY state DESC;

執行上面查詢語句,得到以下結果 -

state列有NULL值,這意味著state資料與某些城市(例如:Beijing, HiroshimaLondon)無關。

當使用非NULL值對混合NULL進行排序時,Oracle允許指定哪個應該首先出現。

例如,以下語句按升序對state列進行排序,並首先將NULL值放置在前面。

SELECT country_id, city, state
FROM
    locations
ORDER BY
    state ASC NULLS FIRST;

要放置NULL值在後面,可以使用NULLS LAST,如下面的語句所示:

SELECT country_id, city, state
FROM
    locations
ORDER BY
    state ASC NULLS LAST;

執行上面範例查詢語句,得到以下結果:

5. 按函式或表示式排序資料

ORDER BY子句可在一列上應用一個函式,例如字串函式,數學函式等,並按函式的結果對資料進行排序。

例如,以下語句使用ORDER BY子句中的UPPER()函式來區分客戶名稱的大小寫:

SELECT customer_id, name
FROM customers
ORDER BY UPPER( name );

執行上面查詢語句,得到以下結果 -

在本教學中,您已學習如何使用Oracle ORDER BY子句按升序或降序對一列或多列進行排序。