摘要:在本教程中,您将学习如何使用 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 子句