SQL Order By排序


本教學將演示如何使用SQL ORDER BY子句根據指定的標準按升序或降序對結果集進行排序。

1. SQL ORDER BY子句簡介

當使用SELECT語句查詢表中的資料時,結果集中顯示的行的順序可能與您的預期不符。

在某些情況下,結果集中顯示的行按其物理儲存在表中的順序排列。 但是,如果查詢優化器使用索引來處理查詢,則行記錄將顯示為它們以索引鍵順序儲存。 因此,結果集中的行順序未確定或不可預測。

查詢優化器是資料庫系統中的內建軟體元件,用於確定SQL語句查詢請求資料的最有效方式。

要準確指定結果集中的行順序,請在SELECT語句中新增使用ORDER BY子句,如下所示:

SELECT 
    column1, column2
FROM
    table_name
ORDER BY column1 ASC , 
         column2 DESC;

在此語法中,ORDER BY子句放在FROM子句之後。 如果SELECT語句包含WHERE子句,則ORDER BY子句必須放在WHERE子句之後。

要對結果集進行排序,請指定要排序的列以及排序順序的型別:

  • 升序(使用:ASC表示)
  • 降序(使用:DESC表示)

如果未指定排序順序,則資料庫系統通常預設按升序(ASC)對結果集進行排序。

當在ORDER BY子句中包含多個列時,資料庫系統首先根據第一列對結果集進行排序,然後根據第二列對排序的結果集進行排序,依此類推。

2. SQL ORDER BY子句範例

我們將使用範例資料庫中的employees表進行演示。

SELECT
    employee_id,
    first_name,
    last_name,
    hire_date,
    salary
FROM
    employees;

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

+-------------+------------+-----------+------------+--------+
| employee_id | first_name | last_name | hire_date  | salary |
+-------------+------------+-----------+------------+--------+
|         100 | Steven     | Lee       | 1987-06-17 | 24000  |
|         101 | Neena      | Wong      | 1989-09-21 | 17000  |
|         102 | Lex        | Liang     | 1993-01-13 | 17000  |
|         103 | Alexander  | Lee       | 1990-01-03 | 9000   |
|         104 | Bruce      | Wong      | 1991-05-21 | 6000   |
|         105 | David      | Liang     | 1997-06-25 | 4800   |
|         106 | Valli      | Chen      | 1998-02-05 | 4800   |
|         107 | Diana      | Chen      | 1999-02-07 | 4200   |
... ...
|         200 | Jennifer   | Zhao      | 1987-09-17 | 4400   |
|         201 | Michael    | Zhou      | 1996-02-17 | 13000  |
|         202 | Pat        | Zhou      | 1997-08-17 | 6000   |
|         203 | Susan      | Zhou      | 1994-06-07 | 6500   |
|         204 | Hermann    | Wu        | 1994-06-07 | 10000  |
|         205 | Shelley    | Wu        | 1994-06-07 | 12000  |
|         206 | William    | Wu        | 1994-06-07 | 8300   |
+-------------+------------+-----------+------------+--------+
40 rows in set

似乎行記錄顯示為儲存在employees表中順序。 要按字母順序按名字對員工進行排序,請按如下方式新增ORDER BY子句進行查詢:

SELECT
    employee_id,
    first_name,
    last_name,
    hire_date,
    salary
FROM
    employees
ORDER BY
    first_name;

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

+-------------+------------+-----------+------------+--------+
| employee_id | first_name | last_name | hire_date  | salary |
+-------------+------------+-----------+------------+--------+
|         103 | Alexander  | Lee       | 1990-01-03 | 9000   |
|         115 | Alexander  | Su        | 1995-05-18 | 3100   |
|         114 | Avg        | Su        | 1994-12-07 | 11000  |
|         193 | Britney    | Zhao      | 1997-03-03 | 3900   |
|         104 | Bruce      | Wong      | 1991-05-21 | 6000   |
... ...
|         117 | Sigal      | Zhang     | 1997-07-24 | 3000   |
|         100 | Steven     | Lee       | 1987-06-17 | 24000  |
|         203 | Susan      | Zhou      | 1994-06-07 | 6500   |
|         106 | Valli      | Chen      | 1998-02-05 | 4800   |
|         206 | William    | Wu        | 1994-06-07 | 8300   |
+-------------+------------+-----------+------------+--------+
40 rows in set

現在,結果集按first_name列的值的字母順序進行排序。

3. SQL ORDER BY - 按多列排序範例

要將員工按名字(first_name)列升序排列,然後再按姓氏(last_name)降序排序,請使用以下語句:

SELECT
    employee_id,
    first_name,
    last_name,
    hire_date,
    salary
FROM
    employees
ORDER BY
    first_name,
    last_name DESC;

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

+-------------+------------+-----------+------------+--------+
| employee_id | first_name | last_name | hire_date  | salary |
+-------------+------------+-----------+------------+--------+
|         115 | Alexander  | Su        | 1995-05-18 | 3100   |
|         103 | Alexander  | Lee       | 1990-01-03 | 9000   |
|         114 | Avg        | Su        | 1994-12-07 | 11000  |
|         193 | Britney    | Zhao      | 1997-03-03 | 3900   |
|         104 | Bruce      | Wong      | 1991-05-21 | 6000   |
|         179 | Charles    | Yang      | 2000-01-04 | 6200   |
... ...
|         113 | Min        | Su        | 1999-12-07 | 6900   |
|         122 | Min        | Liu       | 1995-05-01 | 7900   |
|         108 | Nancy      | Chen      | 1994-08-17 | 12000  |
|         101 | Neena      | Wong      | 1989-09-21 | 17000  |
|         202 | Pat        | Zhou      | 1997-08-17 | 6000   |
|         192 | Sarah      | Zhang     | 1996-02-04 | 4000   |
|         123 | Shanta     | Liu       | 1997-10-10 | 6500   |
|         205 | Shelley    | Wu        | 1994-06-07 | 12000  |
|         116 | Shelli     | Zhang     | 1997-12-24 | 3000   |
|         117 | Sigal      | Zhang     | 1997-07-24 | 3000   |
|         100 | Steven     | Lee       | 1987-06-17 | 24000  |
|         203 | Susan      | Zhou      | 1994-06-07 | 6500   |
|         106 | Valli      | Chen      | 1998-02-05 | 4800   |
|         206 | William    | Wu        | 1994-06-07 | 8300   |
+-------------+------------+-----------+------------+--------+
40 rows in set

首先,資料庫系統按升序對第一列(first_name)的結果集進行排序,然後按降序對按姓氏(last_name)排序的排序結果進行排序。 請注意兩名員工:Alexander SuAlexander Lee的位置變化。

4. SQL ORDER BY - 按數位列範例排序

SQL用於按字母順序對資料進行排序,如上例所示,並以數位方式對資料進行排序。 例如,以下語句選擇員工資料,並按降序對薪水(salary)列結果進行排序:

SELECT
    employee_id,
    first_name,
    last_name,
    hire_date,
    salary
FROM
    employees
ORDER BY
    salary DESC;

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

+-------------+------------+-----------+------------+--------+
| employee_id | first_name | last_name | hire_date  | salary |
+-------------+------------+-----------+------------+--------+
|         100 | Steven     | Lee       | 1987-06-17 | 24000  |
|         101 | Neena      | Wong      | 1989-09-21 | 17000  |
|         102 | Lex        | Liang     | 1993-01-13 | 17000  |
|         145 | John       | Liu       | 1996-10-01 | 14000  |
|         146 | Karen      | Liu       | 1997-01-05 | 13500  |
|         201 | Michael    | Zhou      | 1996-02-17 | 13000  |
|         108 | Nancy      | Chen      | 1994-08-17 | 12000  |
|         205 | Shelley    | Wu        | 1994-06-07 | 12000  |
... ...
|         193 | Britney    | Zhao      | 1997-03-03 | 3900   |
|         115 | Alexander  | Su        | 1995-05-18 | 3100   |
|         116 | Shelli     | Zhang     | 1997-12-24 | 2900   |
|         117 | Sigal      | Zhang     | 1997-07-24 | 2800   |
|         126 | Irene      | Liu       | 1998-09-28 | 2700   |
|         118 | Guy        | Zhang     | 1998-11-15 | 2600   |
|         119 | Karen      | Zhang     | 1999-08-10 | 2500   |
+-------------+------------+-----------+------------+--------+
40 rows in set

5. SQL ORDER BY - 按日期排序範例

除了字元和數位,SQL還可以按日期對結果集進行排序。 以下語句按hire_date列中的值按升序對員工進行排序。

SELECT
    employee_id,
    first_name,
    last_name,
    hire_date,
    salary
FROM
    employees
ORDER BY
    hire_date;

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

+-------------+------------+-----------+------------+--------+
| employee_id | first_name | last_name | hire_date  | salary |
+-------------+------------+-----------+------------+--------+
|         100 | Steven     | Lee       | 1987-06-17 | 24000  |
|         200 | Jennifer   | Zhao      | 1987-09-17 | 4400   |
|         101 | Neena      | Wong      | 1989-09-21 | 17000  |
|         103 | Alexander  | Lee       | 1990-01-03 | 9000   |
|         104 | Bruce      | Wong      | 1991-05-21 | 6000   |
|         102 | Lex        | Liang     | 1993-01-13 | 17000  |
|         204 | Hermann    | Wu        | 1994-06-07 | 10000  |
......
|         107 | Diana      | Chen      | 1999-02-07 | 4200   |
|         178 | Kimberely  | Yang      | 1999-05-24 | 7000   |
|         119 | Karen      | Zhang     | 1999-08-10 | 2500   |
|         113 | Min        | Su        | 1999-12-07 | 6900   |
|         179 | Charles    | Yang      | 2000-01-04 | 6200   |
+-------------+------------+-----------+------------+--------+
40 rows in set

要檢視剛剛加入公司的最新員工,可以按僱用日期(hire_date)的降序對員工進行排序,如下面的語句所示:

SELECT
    employee_id,
    first_name,
    last_name,
    hire_date,
    salary
FROM
    employees
ORDER BY
    hire_date DESC;

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

+-------------+------------+-----------+------------+--------+
| employee_id | first_name | last_name | hire_date  | salary |
+-------------+------------+-----------+------------+--------+
|         179 | Charles    | Yang      | 2000-01-04 | 6200   |
|         113 | Min        | Su        | 1999-12-07 | 6900   |
|         119 | Karen      | Zhang     | 1999-08-10 | 2500   |
|         178 | Kimberely  | Yang      | 1999-05-24 | 7000   |
......
|         104 | Bruce      | Wong      | 1991-05-21 | 6000   |
|         103 | Alexander  | Lee       | 1990-01-03 | 9000   |
|         101 | Neena      | Wong      | 1989-09-21 | 17000  |
|         200 | Jennifer   | Zhao      | 1987-09-17 | 4400   |
|         100 | Steven     | Lee       | 1987-06-17 | 24000  |
+-------------+------------+-----------+------------+--------+
40 rows in set

在本教學中,您學習了如何使用SQL ORDER BY子句根據一個或多個列的升序或降序來對結果集進行排序。