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 AdventureWorks2008R2;
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.Person
WHERE LastName LIKE 'R%'
ORDER BY FirstName ASC, LastName DESC ;