SQL Server Order By子句

在本教學中,將學習如何使用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 - 使用ASCDESC指定是否應按昇冪或降序對指定列中的值進行排序。ASC將結果從最低值排序到最高值,而DESC將結果集從最高值排序到最低值。如果未明確指定ASCDESC,則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;

執行上面查詢語句,得到以下結果:

在此示例中,由於未指定ASCDESCORDER 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子句按列昇冪或降序對結果集進行排序。


上一篇: SQL Server數據查詢 下一篇: SQL Server連接表