SQL ORDER BY 子句

在本教程中,你將學習如何對 SQL 中的 SELECT 查詢返回的資料進行排序。

對結果排序

通常,當你使用 SELECT 語句從表中獲取資料時,結果集中的行不按任何特定順序排列。如果希望以特定順序設定結果集,則可以在語句末尾指定 ORDER BY 子句,該子句告訴伺服器如何對查詢返回的資料進行排序。預設排序順序為升序。

語法

ORDER BY 子句用於按查詢升序或降序對查詢返回的資料進行排序。該子句的基本語法如下:

SELECT column_list FROM table_name ORDER BY column_name ASC | DESC ; 

這裡,column_list 是要獲取其值的資料庫表的列/欄位的名稱,如名稱年齡國家 / 地區等,而 column_name 是要排序的列的名稱。讓我們看一些示例來說明它是如何工作的。

考慮我們的資料庫中有一個 employees 表,其中包含以下記錄:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      1 | Ethan Hunt   | 2001-05-01 |   5000 |       4 |
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
+--------+--------------+------------+--------+---------+

排序單列

以下 SQL 語句將返回 employees 表中的所有員工,並按 emp_name 列按升序對結果集進行排序。

SELECT * FROM employees 
ORDER BY emp_name ASC;

你可以省略 ASC 選項並只使用以下語法。它返回與前一個語句相同的結果集,因為預設排序順序是升序:

SELECT * FROM employees 
ORDER BY emp_name;

執行上面的命令後,你會得到這樣的輸出:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      1 | Ethan Hunt   | 2001-05-01 |   5000 |       4 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
+--------+--------------+------------+--------+---------+

同樣,你可以使用 DESC 選項按降序執行排序。以下語句將按降序排列數字 salary 列的結果集。

SELECT * FROM employees 
ORDER BY salary DESC;

這一次,你將獲得如下結果集:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
|      1 | Ethan Hunt   | 2001-05-01 |   5000 |       4 |
+--------+--------------+------------+--------+---------+

排序多列

你還可以在排序時指定多個列。但是,在表中存在重複值之前,結果集中的更改將不可見。好吧,讓我們來看看:

為了更好地理解多列排序,我們假設我們在資料庫中有一個名為 trainees 的表,其中包含以下記錄:

+----+------------+------------+-------------+--------+
| id | first_name | last_name  | birth_date  | gender |
+----+------------+------------+-------------+--------+
|  1 | Peter      | Parker     | 1998-03-04  |  M     |
|  2 | Harry      | Potter     | 2001-08-30  |  M     |
|  3 | Peter      | Pan        | 2004-09-19  |  M     |
|  4 | Alice      | Kingsleigh | 1999-07-02  |  F     |
|  5 | John       | Connor     | 2002-01-15  |  M     |
+----+------------+------------+-------------+--------+

如果你仔細看錶,你會發現我們有一些重複的值。然而,受訓者 Peter ParkerPeter Pan 的全名不同,但他們的名是相同的。

現在執行以下命令,該命令對 first_name 列的結果集進行排序

SELECT * FROM trainees 
ORDER BY first_name;

執行後,你將獲得如下輸出:

+----+------------+------------+-------------+--------+
| id | first_name | last_name  | birth_date  | gender |
+----+------------+------------+-------------+--------+
|  4 | Alice      | Kingsleigh | 1999-07-02  |  F     |
|  2 | Harry      | Potter     | 2001-08-30  |  M     |
|  5 | John       | Connor     | 2002-01-15  |  M     |
|  1 | Peter      | Parker     | 1998-03-04  |  M     |
|  3 | Peter      | Pan        | 2004-09-19  |  M     |
+----+------------+------------+-------------+--------+

現在執行此語句,該語句按 first_namelast_name 列對結果集進行排序

SELECT * FROM trainees 
ORDER BY first_name, last_name;
+----+------------+------------+-------------+--------+
| id | first_name | last_name  | birth_date  | gender |
+----+------------+------------+-------------+--------+
|  4 | Alice      | Kingsleigh | 1999-07-02  |  F     |
|  2 | Harry      | Potter     | 2001-08-30  |  M     |
|  5 | John       | Connor     | 2002-01-15  |  M     |
|  3 | Peter      | Pan        | 2004-09-19  |  M     |
|  1 | Peter      | Parker     | 1998-03-04  |  M     |
+----+------------+------------+-------------+--------+

你是否注意到之前和當前結果集之間的差異 - 這次受訓者 Peter Parker 的記錄是在 Peter Pan 之後。

由於兩名受訓者的名字相同,即 Peter,因此在這兩名學員的 last_name 欄中進行第二級排序,這就是為什麼受訓者 Peter Parker 的記錄在 Peter Pan 之後出現的原因。

注意: 如果指定了多個排序列,則結果集最初按第一列排序,然後該排序列表按第二列排序,依此類推。