1. 程式人生 > 其它 >如何使用 SQL ORDER BY 根據需要排序檢索出的資料

如何使用 SQL ORDER BY 根據需要排序檢索出的資料

目錄

本文介紹如何使用 SQL ORDER BY 子句,對檢索出的資料進行排序。根據需要,可以利用它在一個或多個列上對資料進行排序。

一、排序資料

正如 如何使用 SQL 的 SELECT 語句從表中檢索一個或多個數據列 所述,下面的 SQL 語句返回某個資料庫表的單個列。但請看其輸出,並沒有特定的順序。

SELECT prod_name
FROM Products;

輸出:

prod_name
--------------------
Fish bean bag toy
Bird bean bag toy
Rabbit bean bag toy
8 inch teddy bear
12 inch teddy bear
18 inch teddy bear
Raggedy Ann
King doll
Queen doll

其實,檢索出的資料並不是隨機顯示的。如果不排序,資料一般將以它在表中出現的順序顯示,這有可能是資料最初新增到表中的順序。

但是,如果資料隨後進行過更新或刪除,那麼這個順序將會受到 DBMS 重用回收儲存空間的方式的影響。

因此,如果不明確控制的話,則最終的結果不能(也不應該)依賴該排序順序。關係資料庫設計理論認為,如果不明確規定排序順序,則不應該假定檢索出的資料的順序有任何意義。

子句(clause)

SQL 語句由子句構成,有些子句是必需的,有些則是可選的。一個子句通常由一個關鍵字加上所提供的資料組成。

子句的例子有我們在 如何使用 SQL 的 SELECT 語句從表中檢索一個或多個數據列

看到的 SELECT 語句的 FROM 子句。

為了明確地排序用 SELECT 語句檢索出的資料,可使用 ORDER BY 子句。ORDER BY 子句取一個或多個列的名字,據此對輸出進行排序。請看下面的例子:

SELECT prod_name
FROM Products
ORDER BY prod_name;

除了指示 DBMS 軟體對 prod_name 列以字母順序排序資料的 ORDER BY 子句外,這條語句與前面的語句相同。結果如下。

輸出:

prod_name
--------------------
12 inch teddy bear
18 inch teddy bear
8 inch teddy bear
Bird bean bag toy
Fish bean bag toy
King doll
Queen doll
Rabbit bean bag toy
Raggedy Ann

注意:ORDER BY 子句的位置

在指定一條 ORDER BY 子句時,應該保證它是 SELECT 語句中最後一條子句。如果它不是最後的子句,將會出錯。

提示:通過非選擇列進行排序

通常,ORDER BY 子句中使用的列將是為顯示而選擇的列。但是,實際上並不一定要這樣,用非檢索的列排序資料是完全合法的。

二、按多個列排序

經常需要按不止一個列進行資料排序。例如,如果要顯示僱員名單,可能希望按姓和名排序(首先按姓排序,然後在每個姓中再按名排序)。如果多個僱員有相同的姓,這樣做很有用。

要按多個列排序,只須指定這些列名,列名之間用逗號分開即可(就像選擇多個列時那樣)。

下面的程式碼檢索 3 個列,並按其中兩個列對結果進行排序——首先按價格,然後按名稱排序。

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name;

輸出:

prod_id     prod_price     prod_name
-------     ----------     --------------------
BNBG02      3.4900         Bird bean bag toy
BNBG01      3.4900         Fish bean bag toy
BNBG03      3.4900         Rabbit bean bag toy
RGAN01      4.9900         Raggedy Ann
BR01        5.9900         8 inch teddy bear
BR02        8.9900         12 inch teddy bear
RYL01       9.4900         King doll
RYL02       9.4900         Queen doll
BR03        11.9900        18 inch teddy bear

重要的是理解在按多個列排序時,排序的順序完全按規定進行。

換句話說,對於上述例子中的輸出,僅在多個行具有相同的 prod_price 值時才對產品按 prod_name 進行排序。如果 prod_price 列中所有的值都是唯一的,則不會按 prod_name 排序。

三、按列位置排序

除了能用列名指出排序順序外,ORDER BY 還支援按相對列位置進行排序。為理解這一內容,我們來看個例子:

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;

輸出:

prod_id     prod_price     prod_name
-------     ----------     --------------------
BNBG02      3.4900         Bird bean bag toy
BNBG01      3.4900         Fish bean bag toy
BNBG03      3.4900         Rabbit bean bag toy
RGAN01      4.9900         Raggedy Ann
BR01        5.9900         8 inch teddy bear
BR02        8.9900         12 inch teddy bear
RYL01       9.4900         King doll
RYL02       9.4900         Queen doll
BR03        11.9900        18 inch teddy bear

可以看到,這裡的輸出與上面的查詢相同,不同之處在於 ORDER BY 子句。SELECT 清單中指定的是選擇列的相對位置而不是列名。ORDER BY 2 表示按 SELECT 清單中的第二個列 prod_price 進行排序。ORDER BY 2, 3 表示先按 prod_price,再按 prod_name 進行排序。

這一技術的主要好處在於不用重新輸入列名。但它也有缺點。首先,不明確給出列名有可能造成錯用列名排序。其次,在對 SELECT 清單進行更改時容易錯誤地對資料進行排序(忘記對 ORDER BY 子句做相應的改動)。

最後,如果進行排序的列不在 SELECT 清單中,顯然不能使用這項技術。

提示:按非選擇列排序

顯然,當根據不出現在 SELECT 清單中的列進行排序時,不能採用這項技術。但是,如果有必要,可以混合使用實際列名和相對列位置。

四、指定排序方向

資料排序不限於升序排序(從 A 到 Z),這只是預設的排序順序。還可以使用 ORDER BY 子句進行降序(從 Z 到 A)排序。為了進行降序排序,必須指定 DESC 關鍵字。

下面的例子以價格降序來排序產品(最貴的排在最前面):

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC;

輸出:

prod_id     prod_price     prod_name
-------     ----------     --------------------
BR03        11.9900        18 inch teddy bear
RYL01       9.4900         King doll
RYL02       9.4900         Queen doll
BR02        8.9900         12 inch teddy bear
BR01        5.9900         8 inch teddy bear
RGAN01      4.9900         Raggedy Ann
BNBG01      3.4900         Fish bean bag toy
BNBG02      3.4900         Bird bean bag toy
BNBG03      3.4900         Rabbit bean bag toy

如果打算用多個列排序,該怎麼辦?下面的例子以降序排序產品(最貴的在最前面),再加上產品名:

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name;

輸出:

prod_id     prod_price     prod_name
-------     ----------     --------------------
BR03        11.9900        18 inch teddy bear
RYL01       9.4900         King doll
RYL02       9.4900         Queen doll
BR02        8.9900         12 inch teddy bear
BR01        5.9900         8 inch teddy bear
RGAN01      4.9900         Raggedy Ann
BNBG02      3.4900         Bird bean bag toy
BNBG01      3.4900         Fish bean bag toy
BNBG03      3.4900         Rabbit bean bag toy

DESC 關鍵字只應用到直接位於其前面的列名。在上例中,只對 prod_price 列指定 DESC,對 prod_name 列不指定。

因此,prod_price 列以降序排序,而 prod_name 列(在每個價格內)仍然按標準的升序排序。

警告:在多個列上降序排序

如果想在多個列上進行降序排序,必須對每一列指定 DESC 關鍵字。

請注意,DESCDESCENDING 的縮寫,這兩個關鍵字都可以使用。與 DESC 相對的是 ASC(或 ASCENDING),在升序排序時可以指定它。

但實際上,ASC 沒有多大用處,因為升序是預設的(如果既不指定 ASC 也不指定 DESC,則假定為 ASC)。

提示:區分大小寫和排序順序

在對文字性資料進行排序時,A 與 a 相同嗎?a 位於 B 之前,還是 Z 之後?這些問題不是理論問題,其答案取決於資料庫的設定方式。

在字典(dictionary)排序順序中,A 被視為與 a 相同,這是大多數資料庫管理系統的預設做法。但是,許多 DBMS 允許資料庫管理員在需要時改變這種行為(如果你的資料庫包含大量外語字元,可能必須這樣做)。

這裡的關鍵問題是,如果確實需要改變這種排序順序,用簡單的 ORDER BY 子句可能做不到。你必須請求資料庫管理員的幫助。

五、小結

本文介紹瞭如何用 SELECT 語句的 ORDER BY 子句對檢索出的資料進行排序。這個子句必須是 SELECT 語句中的最後一條子句。根據需要,可以利用它在一個或多個列上對資料進行排序。

原文連結:https://www.developerastrid.com/sql/sql-order-by

(完)