目錄
- 一、排序資料
- 二、按多個列排序
- 三、按列位置排序
- 四、指定排序方向
- 五、小結
本文介紹如何使用 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
(完)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/459603.html
標籤:SQL Server
