在本教學中,將學習如何使用SQL Server ORDER BY
子句按一列或多列對查詢的結果集進行排序。
SQL Server ORDER BY子句簡介
使用SELECT
語句從表中查詢數據時,不保證結果集中的行順序。 這意味著SQL Server可以返回具有未指定行順序的結果集。
保證結果集中的行已排序的方法是使用ORER BY
子句。 以下是ORDER BY
子句的語法:
SELECT
select_list
FROM
table_name
ORDER BY
[column_name | expression] [ASC | DESC ]
在上面語法中,
column_name | expression
- 指定要對查詢結果集進行排序的列名或運算式。 如果指定多個列,則結果集按第一列排序,然後該排序結果集按第二列排序,依此類推。ORDER BY
子句中出現的列必須對應於選擇列表中的列或FROM
子句中指定的表中定義的列。ASC | DESC
- 使用ASC
或DESC
指定是否應按昇冪或降序對指定列中的值進行排序。ASC
將結果從最低值排序到最高值,而DESC
將結果集從最高值排序到最低值。如果未明確指定ASC
或DESC
,則SQL Server將默認使用ASC
來排序順序。 此外,SQL Server將NULL
視為最低值。
處理具有ORDER BY
子句的SELECT
語句時,ORDER BY
子句是要處理的最後一個子句。
SQL Server ORDER BY子句示例
將使用示例資料庫中的customers
表進行演示。
1. 按昇冪對結果集進行排序
以下語句按名字按昇冪對客戶列表進行排序:
SELECT
first_name,
last_name
FROM
sales.customers
ORDER BY
first_name;
執行上面查詢語句,得到以下結果:
在此示例中,由於未指定ASC
或DESC
,ORDER BY
子句默認使用ASC
。
2. 按降序對結果集按一列排序
以下語句按名字降序對客戶列表進行排序。
SELECT
firstname,
lastname
FROM
sales.customers
ORDER BY
first_name DESC;
執行上面查詢語句,得到以下結果:
在此示例中,因為顯式指定了DESC
,所以ORDER BY
子句按降序對first_name
列中的值對結果集進行降序排序。
3. 按多列對結果集進行排序
以下語句檢索客戶的名字,姓氏和城市。 它首先按城市對客戶列表進行排序,然後按名字排序。
SELECT
city,
first_name,
last_name
FROM
sales.customers
ORDER BY
city,
first_name;
執行上面查詢語句,得到以下結果:
4. 按多列和不同順序對結果集進行排序
以下語句按城市按降序對客戶進行排序,之後按第一個名稱按昇冪對排序結果進行排序。
SELECT
city,
first_name,
last_name
FROM
sales.customers
ORDER BY
city DESC,
first_name ASC;
執行上面查詢語句,得到以下結果:
5. 按不在選擇列表中的列對結果集進行排序
可以通過選擇列表中未顯示的列對結果集進行排序。 例如,以下語句按state
對客戶進行排序,即使state
列未顯示在選擇列表中。
SELECT
city,
first_name,
last_name
FROM
sales.customers
ORDER BY
state;
執行上面查詢語句,得到以下結果:
請注意,state
列在customers
表中定義。 如果不是,那麼查詢將無效。
6. 按運算式對結果集進行排序
LEN()
函數返回字串的字元數。 以下語句使用ORDER BY
子句中的LEN()
函數來檢索按名字長度排序客戶列表。
SELECT
first_name,
last_name,
LEN(first_name) as len_name
FROM
sales.customers
ORDER BY
LEN(first_name) DESC;
執行上面查詢語句,得到以下結果:
7. 按列的序數位置排序
SQL Server允許根據選擇列表中顯示的列的序號位置對結果集進行排序。
以下語句按名字和姓氏對客戶進行排序。 但是它沒有顯式指定列名,而是使用列的序號位置:
SELECT
first_name,
last_name
FROM
sales.customers
ORDER BY
1,
2;
執行上面查詢語句,得到以下結果:
在此示例中,1
表示first_name
列,2
表示last_name
列。
由於幾個原因,在ORDER BY
子句中使用列的序號位置是不推薦使用的。
- 首先,表中的列沒有序號位置,需要按名稱引用。
- 其次,當修改選擇列表時,可能忘記在
ORDER BY
子句中進行相應的更改。
因此,最好始終在ORDER BY
子句中顯式指定列名。
在本教學中,學習了如何使用SQL Server ORDER BY
子句按列昇冪或降序對結果集進行排序。