ORDER BY 子句 (Transact-SQL)
指定 SELECT 陳述式傳回的資料行所用的排序順序。除非在檢視、內嵌函數、衍生資料表和子查詢中,也指定了 TOP,否則 ORDER BY 子句無效。
[!附註]
在檢視、內嵌函數、衍生資料表或子查詢的定義中使用 ORDER BY 子句時,這個子句只能用來判斷 TOP 子句傳回的資料列。除非同時在查詢本身指定 ORDER BY 子句,否則 ORDER BY 子句並不保證在查詢上述建構時會傳回排序的結果。
語法
[ ORDER BY
{
order_by_expression
[ COLLATE collation_name ]
[ ASC | DESC ]
} [ ,...n ]
]
引數
order_by_expression
指定用來排序的資料行。排序資料行可以指定為名稱或資料行別名,或代表名稱或別名在選取清單中之位置的非負整數。當次序函數中出現 order_by_expression 時不能指定整數。排序資料行可以包含運算式,但是當資料庫設定為 SQL Server (90) 相容性模式時,該運算式便無法解析成常數。資料行名稱和別名可以用資料表或檢視表名稱來限定。在 SQL Server 中,限定的資料行名稱和別名會解析為 FROM 子句所列出的資料行。如果 order_by_expression 未限定,這個值在 SELECT 陳述式所列出的所有資料行之間必須是唯一的。您可以指定多個排序資料行。ORDER BY 子句中的排序資料行順序用來定義排序結果集的組織。
ORDER BY 子句可包括未出現在選取清單中的項目。不過,如果指定了 SELECT DISTINCT,或陳述式包含 GROUP BY 子句,或是 SELECT 陳述式包含 UNION 運算子,排序資料行就必須出現在選取清單中。
另外,當 SELECT 陳述式包括 UNION 運算子時,資料行名稱或資料行別名必須是第一份選取清單中所指定者。
[!附註]
ORDER BY 子句不能使用 ntext、text、image 或 xml 資料行。
COLLATE {collation_name}
指定應該根據 collation_name 中所指定的定序來執行 ORDER BY 作業,而不是根據資料表或檢視中所定義的資料行定序來執行。collation_name 可以是 Windows 定序名稱,也可以是 SQL 定序名稱。如需詳細資訊,請參閱<安裝程式中的定序設定>和<使用 SQL Server 定序>。COLLATE 只適用於 char、varchar、nchar 和 nvarchar 等資料類型的資料行。ASC
指定在指定資料行中的值應該從最低值到最高值,依照遞增順序來儲存。ASC 是預設排序。DESC
指定在指定資料行中的值應該從最高值到最低值,依照遞減順序來儲存。
備註
Null 值會當作最低的可能值來處理。
ORDER BY 子句中的項目數沒有限制。不過,排序作業所需要的中繼工作資料表,資料列大小限制為 8,060 位元組。這會限制 ORDER BY 子句所指定之資料行的總大小。
當搭配 SELECT...INTO 陳述式一起使用,以插入其他來源的資料列時,ORDER BY 子句無法保證資料列會依照指定順序插入。
範例
下列範例示範對結果集進行排序。
依照數值 ProductID 資料行來排序。預設為遞增順序排序。
USE AdventureWorks
GO
SELECT ProductID, Name FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID ;
依照數值 ProductID 資料行以遞減順序排序。
SELECT ProductID, Name FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID DESC;
依照 Name 資料行來排序。請注意,字元會以字母順序排序,而不是以數值順序排序。也就是說,10 會排序在 2 之前。
SELECT ProductID, Name FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY Name ASC ;
依照兩個資料行來排序。這個查詢會先依照 FirstName 資料行以遞增順序排序,然後再依照 LastName 資料行以遞減順序排序。
SELECT LastName, FirstName FROM Person.Contact
WHERE LastName LIKE 'R%'
ORDER BY FirstName ASC, LastName DESC ;