使用 ORDER BY 排序資料列
ORDER BY 子句可依一或多個資料行 (最多為 8,060 個位元組) 來排序查詢結果。如需 ORDER BY 子句大小上限的詳細資訊,請參閱<ORDER BY 子句 (Transact-SQL)>。
從 MicrosoftSQL Server 2005 開始,SQL Server 允許從 FROM 子句中的資料表指定排序資料行,而不是在 SELECT 清單中指定。ORDER BY 子句中參考的資料行名稱必須對應到 SELECT 清單中的資料行,或語意明確之 FROM 子句中資料表的資料行。如果資料行名稱在 SELECT 清單中使用的是別名,則 ORDER BY 子句中只能使用別名。同樣地,如果資料表名稱在 FROM 子句中使用的是別名,則只能使用別名來限定其在 ORDER BY 子句中的資料行。
排序可以是遞增 (ASC) 或遞減 (DESC)。如果都未指定,將採用 ASC。
下列查詢會傳回按 ProductID 遞增排序的結果:
USE AdventureWorks;
GO
SELECT ProductID, ProductLine, ProductModelID
FROM Production.Product
ORDER BY ProductID
若有多個資料行出現在 ORDER BY 子句中,將會形成巢狀的排序。下列陳述式會排序 Production.Product 資料表中的資料列,其會先依照遞減順序來排序產品子類別目錄,然後在每個產品子類別目錄內依照遞增順序來排序 ListPrice。
USE AdventureWorks;
GO
SELECT ProductID, ProductSubcategoryID, ListPrice
FROM Production.Product
ORDER BY ProductSubcategoryID DESC, ListPrice
ORDER BY 子句的確切結果會根據正在排序之資料行的定序來決定。如需詳細資訊,請參閱<使用定序>。對於 char、varchar、nchar 及 nvarchar 資料行,您可以指定要依據定序執行 ORDER BY 作業,但是這個定序必須不同於資料表或檢視中定義之資料行的定序。您可以指定 Windows 定序名稱或 SQL 定序名稱。例如,在 AdventureWorks 資料庫中,Person.Contact 資料表的 LastName 資料行是利用 Latin1_General 定序來定義,但在下面的指令碼中,是使用 Traditional_Spanish 定序以遞增順序傳回資料行。
USE AdventureWorks;
GO
SELECT LastName FROM Person.Contact
ORDER BY LastName
COLLATE Traditional_Spanish_ci_ai ASC
GO
您不能在擁有 text、ntext、image 或 xml 資料類型的資料行上使用 ORDER BY。另外,ORDER BY 清單中不允許使用子查詢、彙總以及常數運算式。但是,在彙總或運算式的選取清單中可使用使用者指定的名稱。例如:
SELECT Color, AVG (ListPrice) AS 'average list price'
FROM Production.Product
GROUP BY Color
ORDER BY 'average list price'
ORDER BY 只保證會針對查詢的最外層 SELECT 陳述式排序結果。例如,請考慮下列檢視定義:
CREATE VIEW TopView AS
SELECT TOP 50 PERCENT * FROM Person.Contact
ORDER BY LastName
接著,查詢檢視:
SELECT * FROM TopView
雖然檢視定義包含了 ORDER BY 子句,但是只使用該 ORDER BY 子句,來判定 TOP 子句所傳回的資料列。當查詢檢視本身時,SQL Server 不保證結果會經過排序,除非您明確地如下面顯示的查詢指定:
SELECT * FROM TopView
ORDER BY LastName