摘要:在本教程中,您將學習如何使用 SQL ORDER BY 子句,根據一個或多個行的值,按升序或降序對結果集進行排序。
SQL ORDER BY 子句簡介 #
ORDER BY 是 SELECT 語句的一個可選子句。ORDER BY 子句允許您按一個或多個排序表示式,以升序和/或降序對結果集進行排序。
以下是 ORDER BY 子句的語法:
SELECT
select_list
FROM
table_name
ORDER BY
sort_expression [ASC | DESC];Code language: SQL (Structured Query Language) (sql)在此語法中:
- 首先,在
ORDER BY子句中指定一個排序表示式 (sort_expression),您希望根據它來對結果集進行排序。sort_expression可以是表列,也可以是涉及表列的表示式。 - 其次,使用
ASC按升序對結果集進行排序,使用DESC按降序對結果集進行排序。
ASC 和 DESC 分別代表升序(ascending)和降序(descending)。
ORDER BY 子句預設使用 ASC 選項。這意味著,如果您沒有指定 ASC 或 DESC,ORDER BY 子句會按 sort_expression 以升序對結果集中的行進行排序。
請注意,如果您不指定 ORDER BY 子句,SELECT 語句將不會對結果集進行排序。這意味著結果集中的行沒有特定的順序。
ORDER BY 子句允許您按多個表示式對結果集中的行進行排序。在這種情況下,您需要在 ORDER BY 子句中使用逗號分隔的排序表示式列表:
SELECT
select_list
FROM
table_name
ORDER BY
sort_expression_1 [ASC | DESC],
sort_expression_2 [ASC | DESC];Code language: SQL (Structured Query Language) (sql)在此語法中,ORDER BY 子句首先按 sort_expression_1 對結果集進行排序,然後按 sort_expression_2 對已排序的結果集進行排序。
資料庫系統按以下順序評估帶有 ORDER BY 子句的 SELECT 語句:
FROMSELECTORDER BY
由於資料庫系統在 SELECT 子句之後評估 ORDER BY 子句,因此您可以在 ORDER BY 子句中使用列別名。
SQL ORDER BY 子句示例 #
我們將使用示例資料庫中的 employees 表進行演示。

按單列對行進行排序的示例 #
以下示例使用 ORDER BY 子句按名字(first name)的字母順序對員工進行排序:
SELECT
employee_id,
first_name,
last_name
FROM
employees
ORDER BY
first_name;Code language: SQL (Structured Query Language) (sql)
輸出
employee_id | first_name | last_name
-------------+-------------+-------------
121 | Adam | Fripp
103 | Alexander | Hunold
115 | Alexander | Khoo
193 | Britney | Everett
104 | Bruce | Ernst
...在此示例中,ORDER BY 子句根據 first_name 列中的值對結果集的行進行排序。
按多列對行進行排序 #
以下示例使用 ORDER BY 子句按名字(first name)升序和姓氏(last name)降序對員工進行排序:
SELECT
employee_id,
first_name,
last_name
FROM
employees
ORDER BY
first_name,
last_name DESC;Code language: SQL (Structured Query Language) (sql)輸出
employee_id | first_name | last_name
-------------+-------------+-------------
121 | Adam | Fripp
115 | Alexander | Khoo
103 | Alexander | Hunold
193 | Britney | Everett
104 | Bruce | Ernst
179 | Charles | Johnson
...在此示例中,ORDER BY 子句首先按名字升序對行進行排序,然後按姓氏降序對已排序的結果集進行排序。
請注意結果集中兩位員工 Alexander Khoo 和 Alexander Hunold 位置的變化。
按數值列對行進行排序的示例 #
以下示例使用 ORDER BY 子句按薪水從高到低對員工進行排序:
SELECT
employee_id,
first_name,
last_name,
salary
FROM
employees
ORDER BY
salary DESC;Code language: SQL (Structured Query Language) (sql)輸出
employee_id | first_name | last_name | salary
-------------+-------------+-------------+----------
100 | Steven | King | 24000.00
101 | Neena | Kochhar | 17000.00
102 | Lex | De Haan | 17000.00
145 | John | Russell | 14000.00
146 | Karen | Partners | 13500.00
201 | Michael | Hartstein | 13000.00按日期對行進行排序的示例 #
除了字元和數值資料,您還可以使用 ORDER BY 子句按日期對行進行排序。
例如,以下語句使用 ORDER BY 子句按入職日期從早到晚對員工進行排序:
SELECT
first_name,
last_name,
hire_date
FROM
employees
ORDER BY
hire_date;Code language: SQL (Structured Query Language) (sql)輸出
first_name | last_name | hire_date
-------------+-------------+------------
Steven | King | 1987-06-17
Jennifer | Whalen | 1987-09-17
Neena | Kochhar | 1989-09-21
Alexander | Hunold | 1990-01-03
Bruce | Ernst | 1991-05-21
Lex | De Haan | 1993-01-13要按入職日期降序對員工進行排序,您可以使用以下查詢:
SELECT
first_name,
last_name,
hire_date
FROM
employees
ORDER BY
hire_date DESC;Code language: SQL (Structured Query Language) (sql)輸出
first_name | last_name | hire_date
-------------+-------------+------------
Charles | Johnson | 2000-01-04
Luis | Popp | 1999-12-07
Karen | Colmenares | 1999-08-10
Kimberely | Grant | 1999-05-24
Diana | Lorentz | 1999-02-07
...對 NULL 進行排序 #
在 SQL 中,NULL 是一個標記,表示資料缺失或值未知。NULL 很特殊,因為您不能將其與任何值進行比較。
如果要按包含 NULL 的列對行進行排序,您可以選擇將 NULL 放在其他常規值之前或之後。
要將 NULL 放在其他值之前,請在 ORDER BY 子句中使用 NULLS FIRST 選項:
ORDER BY sort_expression NULLS FIRSTCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)如果要將 NULL 放在其他常規值之後,請使用 NULLS LAST 選項:
ORDER BY sort_expression NULLS LASTCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)以下查詢使用帶 NULLS FIRST 選項的 ORDER BY 子句將 NULL 放在其他值之前:
SELECT
first_name,
phone_number
FROM
employees
ORDER BY
phone_number NULLS FIRST;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)輸出
first_name | phone_number
-------------+--------------
John | NULL
Charles | NULL
Kimberely | NULL
Jack | NULL
Jonathon | NULL
Karen | NULL
Jennifer | 515.123.4444
Steven | 515.123.4567
...Code language: plaintext (plaintext)以下查詢使用帶 NULLS LAST 選項的 ORDER BY 子句將 NULL 放在其他值之後:
SELECT
first_name,
phone_number
FROM
employees
ORDER BY
phone_number NULLS LAST;Code language: SQL (Structured Query Language) (sql)輸出
first_name | phone_number
-------------+--------------
...
Irene | 650.124.1224
Sarah | 650.501.1876
Britney | 650.501.2876
Kimberely | NULL
Jack | NULL
Jonathon | NULL
Karen | NULL
John | NULL
Charles | NULLCode language: plaintext (plaintext)摘要 #
- 使用
ORDER BY子句對結果集中的行進行排序。 - 使用
ASC選項按升序排序行,使用DESC選項按降序排序行。 - 使用
NULLS FIRST將NULL放在其他非 NULL 值之前,使用NULLS LAST將NULL放在之後。
資料庫 #
- PostgreSQL ORDER BY 子句
- Oracle ORDER BY 子句
- SQL Server ORDER BY 子句
- MySQL ORDER BY 子句
- SQLite ORDER BY 子句
- Db2 ORDER BY 子句
- MariaDB ORDER BY 子句