MySQL ORDER BY:對查詢結果進行排序

2020-07-16 10:04:44
在 MySQL SELECT 語句中,ORDER BY 子句主要用來將結果集中的資料按照一定的順序進行排序。

其語法格式為:

ORDER BY {<列名> | <表示式> | <位置>} [ASC|DESC]

語法說明如下。

1) 列名

指定用於排序的列。可以指定多個列,列名之間用逗號分隔。

2) 表示式

指定用於排序的表示式。

3) 位置

指定用於排序的列在 SELECT 語句結果集中的位置,通常是一個正整數。

4) ASC|DESC

關鍵字 ASC 表示按升序分組,關鍵字 DESC 表示按降序分組,其中 ASC 為預設值。這兩個關鍵字必須位於對應的列名、表示式、列的位置之後。

使用 ORDER BY 子句應該注意以下幾個方面:
  • ORDER BY 子句中可以包含子查詢。
  • 當排序的值中存在空值時,ORDER BY 子句會將該空值作為最小值來對待。
  • 當在 ORDER BY 子句中指定多個列進行排序時,MySQL 會按照列的順序從左到右依次進行排序。
  • 查詢的資料並沒有以一種特定的順序顯示,如果沒有對它們進行排序,則將根據插入到資料表中的順序顯示。使用 ORDER BY 子句對指定的列資料進行排序。

【範例 1】查詢 tb_students_info 表的 height 欄位值,並對其進行排序,輸入的 SQL 語句和執行結果如下所示。
mysql> SELECT * FROM tb_students_info ORDER BY height;
+----+--------+---------+------+------+--------+------------+
| id | name   | dept_id | age  | sex  | height | login_date |
+----+--------+---------+------+------+--------+------------+
|  2 | Green  |       3 |   23 | F    |    158 | 2016-10-22 |
|  1 | Dany   |       1 |   25 | F    |    160 | 2015-09-10 |
|  4 | Jane   |       1 |   22 | F    |    162 | 2016-12-20 |
|  7 | Lily   |       6 |   22 | F    |    165 | 2016-02-26 |
| 10 | Tom    |       4 |   23 | M    |    165 | 2016-08-05 |
|  8 | Susan  |       4 |   23 | F    |    170 | 2015-10-01 |
|  6 | John   |       2 |   21 | M    |    172 | 2015-11-11 |
|  5 | Jim    |       1 |   24 | M    |    175 | 2016-01-15 |
|  9 | Thomas |       3 |   22 | M    |    178 | 2016-06-07 |
|  3 | Henry  |       2 |   23 | M    |    185 | 2015-05-31 |
+----+--------+---------+------+------+--------+------------+
10 rows in set (0.08 sec)
該語句通過指定 ORDER BY 子句,MySQL 對查詢的 height 列的資料按數值的大小進行了升序排序。

有時需要根據多列進行排序。對多列資料進行排序要將需要排序的列之間用逗號隔開。

【範例 2】查詢 tb_students_info 表中的 name 和 height 欄位,先按 height 排序,再按 name 排序,輸入的 SQL 語句和執行結果如下所示。
mysql> SELECT name,height
    -> FROM tb_students_info
    -> ORDER BY height,name;
+--------+--------+
| name   | height |
+--------+--------+
| Green  |    158 |
| Dany   |    160 |
| Jane   |    162 |
| Lily   |    165 |
| Tom    |    165 |
| Susan  |    170 |
| John   |    172 |
| Jim    |    175 |
| Thomas |    178 |
| Henry  |    185 |
+--------+--------+
10 rows in set (0.09 sec)

注意:在對多列進行排序時,首行排序的第一列必須有相同的列值,才會對第二列進行排序。如果第一列資料中所有的值都是唯一的,將不再對第二列進行排序。

預設情況下,查詢資料按字母升序進行排序(A~Z),但資料的排序並不僅限於此,還可以使用 ORDER BY 對查詢結果進行降序排序(Z~A),這可以通過關鍵字 DESC 實現。可以對多列進行不同的順序排序。

【範例 3】查詢 tb_students_info 表,先按 height 降序排序,再按 name 升序排序,輸入的 SQL 語句和執行過程如下所示。
mysql> SELECT name,height FROM tb_student_info ORDER BY height DESC,name ASC;
+--------+--------+
| name   | height |
+--------+--------+
| Henry  |    185 |
| Thomas |    178 |
| Jim    |    175 |
| John   |    172 |
| Susan  |    170 |
| Lily   |    165 |
| Tom    |    165 |
| Jane   |    162 |
| Dany   |    160 |
| Green  |    158 |
+--------+--------+
10 rows in set (0.00 sec)

注意:DESC 關鍵字只對前面的列進行降序排列,在這裡只對 height 排序,而並沒有對 name 進行排序,因此,height 按降序排序,而 name 仍按升序排序,如果要對多列進行降序排序,必須要在每一列的後面加 DESC 關鍵字。