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 Parker
和 Peter 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_name 和 last_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
之後出現的原因。
注意: 如果指定了多個排序列,則結果集最初按第一列排序,然後該排序列表按第二列排序,依此類推。