本教學將演示如何使用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
子句中包含多個列時,資料庫系統首先根據第一列對結果集進行排序,然後根據第二列對排序的結果集進行排序,依此類推。
我們將使用範例資料庫中的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
列的值的字母順序進行排序。
要將員工按名字(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 Su
和Alexander Lee
的位置變化。
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
除了字元和數位,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
子句根據一個或多個列的升序或降序來對結果集進行排序。