如何使用 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
關鍵字。
請注意,DESC
是 DESCENDING
的縮寫,這兩個關鍵字都可以使用。與 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
(完)