摘要:本教程展示了如何使用 SQL ORDER BY
子句按升序或降序基于特定条件对结果集排序。
SQL ORDER BY 子句简介
ORDER BY
是 SELECT
语句的一个可选子句。ORDER BY
子句让你可以按升序或降序基于一个或多个排序表达式对 SELECT
子句返回的行排序。
以下是 ORDER BY
子句的语法:
SELECT
select_list
FROM
table_name
ORDER BY
sort_expression [ASC | DESC];
Code language: SQL (Structured Query Language) (sql)
在此语法中:
- 首先,在
FROM
子句后放置ORDER BY
子句。数据库将按如下顺序用ORDER BY
* 子句评估SELECT
语句:FROM
>SELECT
>ORDER BY
。 - 其次,在
ORDER BY
子句后指定一个排序表达式。排序表达式指定排序条件。 - 第三,在降序中使用
ASC
选项按排序表达式升序对结果集排序,使用DESC
按排序表达式降序对结果集排序。
注意,如果您没有使用 ASC
或 DESC
,ORDER BY
子句默认使用 ASC
选项。
ORDER BY
子句还允许您按多个表达式对结果集排序。在这种情况下,您需要使用逗号分隔两个排序表达式。
SELECT
select_list
FROM
table_name
ORDER BY
sort_expression_1 [ASC | DESC],
sort_expression_2 [ASC | DESC];
Code language: CSS (css)
在此语法中,ORDER BY
子句首先按 sort_expression_1
对结果集排序,然后按 sort_expression_2
对已排序的结果集排序。
注意,如果您没有指定 ORDER BY
子句,SELECT
语句将不对结果集排序。这意味着结果集中的行没有特定顺序。
SQL ORDER BY 子句示例
我们将使用 样本数据库 中的 employees
表进行演示。

1) 使用 SQL ORDER BY 子句对一列中的值进行排序示例
以下 SELECT
语句返回 employees
表的员工 ID、名字、姓氏、雇佣日期和工资列的数据:
SELECT
employee_id,
first_name,
last_name,
hire_date,
salary
FROM
employees;
Code language: SQL (Structured Query Language) (sql)
+-------------+-------------+-------------+------------+----------+
| employee_id | first_name | last_name | hire_date | salary |
+-------------+-------------+-------------+------------+----------+
| 100 | Steven | King | 1987-06-17 | 24000.00 |
| 101 | Neena | Kochhar | 1989-09-21 | 17000.00 |
| 102 | Lex | De Haan | 1993-01-13 | 17000.00 |
| 103 | Alexander | Hunold | 1990-01-03 | 9000.00 |
| 104 | Bruce | Ernst | 1991-05-21 | 6000.00 |
| 105 | David | Austin | 1997-06-25 | 4800.00 |
| 106 | Valli | Pataballa | 1998-02-05 | 4800.00 |
| 107 | Diana | Lorentz | 1999-02-07 | 4200.00 |
| 108 | Nancy | Greenberg | 1994-08-17 | 12000.00 |
| 109 | Daniel | Faviet | 1994-08-16 | 9000.00 |
| 110 | John | Chen | 1997-09-28 | 8200.00 |
...
您从输出中可以清楚地看到,行没有任何顺序。
以下示例使用 ORDER BY 子句按字母顺序按名字对员工进行排序:
SELECT
employee_id,
first_name,
last_name,
hire_date,
salary
FROM
employees
ORDER BY
first_name;
Code language: SQL (Structured Query Language) (sql)
+-------------+-------------+-------------+------------+----------+
| employee_id | first_name | last_name | hire_date | salary |
+-------------+-------------+-------------+------------+----------+
| 121 | Adam | Fripp | 1997-04-10 | 8200.00 |
| 115 | Alexander | Khoo | 1995-05-18 | 3100.00 |
| 103 | Alexander | Hunold | 1990-01-03 | 9000.00 |
| 193 | Britney | Everett | 1997-03-03 | 3900.00 |
| 104 | Bruce | Ernst | 1991-05-21 | 6000.00 |
| 179 | Charles | Johnson | 2000-01-04 | 6200.00 |
| 109 | Daniel | Faviet | 1994-08-16 | 9000.00 |
| 105 | David | Austin | 1997-06-25 | 4800.00 |
| 114 | Den | Raphaely | 1994-12-07 | 11000.00 |
| 107 | Diana | Lorentz | 1999-02-07 | 4200.00 |
...
ORDER BY
按 first_name
列中的值对行进行排序。
2) 使用 SQL ORDER BY 子句对多列中的值进行排序示例
以下示例使用 ORDER BY 子句按升序对员工进行排序,按降序对姓氏进行排序:
SELECT
employee_id,
first_name,
last_name,
hire_date,
salary
FROM
employees
ORDER BY
first_name,
last_name DESC;
Code language: SQL (Structured Query Language) (sql)
+-------------+-------------+-------------+------------+----------+
| employee_id | first_name | last_name | hire_date | salary |
+-------------+-------------+-------------+------------+----------+
| 121 | Adam | Fripp | 1997-04-10 | 8200.00 |
| 115 | Alexander | Khoo | 1995-05-18 | 3100.00 |
| 103 | Alexander | Hunold | 1990-01-03 | 9000.00 |
| 193 | Britney | Everett | 1997-03-03 | 3900.00 |
| 104 | Bruce | Ernst | 1991-05-21 | 6000.00 |
| 179 | Charles | Johnson | 2000-01-04 | 6200.00 |
| 109 | Daniel | Faviet | 1994-08-16 | 9000.00 |
| 105 | David | Austin | 1997-06-25 | 4800.00 |
| 114 | Den | Raphaely | 1994-12-07 | 11000.00 |
| 107 | Diana | Lorentz | 1999-02-07 | 4200.00 |
| 118 | Guy | Himuro | 1998-11-15 | 2600.00 |
...
在此示例中,ORDER BY 子句按升序对结果集按名字排序,然后按降序按姓氏对已排序的结果集排序。
注意结果集中两名员工的位置发生变化:Alexander Khoo
和 Alexander Hunold
。
3) 使用 SQL ORDER BY 子句对数字列中的值进行排序示例
以下示例使用 ORDER BY 子句按从高到低的工资对员工进行排序:
SELECT
employee_id,
first_name,
last_name,
hire_date,
salary
FROM
employees
ORDER BY
salary DESC;
Code language: SQL (Structured Query Language) (sql)
+-------------+-------------+-------------+------------+----------+
| employee_id | first_name | last_name | hire_date | salary |
+-------------+-------------+-------------+------------+----------+
| 100 | Steven | King | 1987-06-17 | 24000.00 |
| 101 | Neena | Kochhar | 1989-09-21 | 17000.00 |
| 102 | Lex | De Haan | 1993-01-13 | 17000.00 |
| 145 | John | Russell | 1996-10-01 | 14000.00 |
| 146 | Karen | Partners | 1997-01-05 | 13500.00 |
| 201 | Michael | Hartstein | 1996-02-17 | 13000.00 |
| 205 | Shelley | Higgins | 1994-06-07 | 12000.00 |
| 108 | Nancy | Greenberg | 1994-08-17 | 12000.00 |
| 114 | Den | Raphaely | 1994-12-07 | 11000.00 |
...
4) 使用 SQL ORDER BY 按日期排序示例
除了字符和数字数据外,可以使用 ORDER BY 子句按日期对行进行排序。例如,以下语句使用 ORDER BY 子句按 hire_date
列中的值对员工进行排序,从
SELECT
employee_id,
first_name,
last_name,
hire_date,
salary
FROM
employees
ORDER BY
hire_date;
Code language: SQL (Structured Query Language) (sql)
+-------------+-------------+-------------+------------+----------+
| employee_id | first_name | last_name | hire_date | salary |
+-------------+-------------+-------------+------------+----------+
| 100 | Steven | King | 1987-06-17 | 24000.00 |
| 200 | Jennifer | Whalen | 1987-09-17 | 4400.00 |
| 101 | Neena | Kochhar | 1989-09-21 | 17000.00 |
| 103 | Alexander | Hunold | 1990-01-03 | 9000.00 |
| 104 | Bruce | Ernst | 1991-05-21 | 6000.00 |
| 102 | Lex | De Haan | 1993-01-13 | 17000.00 |
| 203 | Susan | Mavris | 1994-06-07 | 6500.00 |
| 204 | Hermann | Baer | 1994-06-07 | 10000.00 |
...
要查看从最近到最早加入公司的员工,按雇用日期降序对员工进行排序
SELECT
employee_id,
first_name,
last_name,
hire_date,
salary
FROM
employees
ORDER BY
hire_date DESC;
Code language: SQL (Structured Query Language) (sql)
+-------------+-------------+-------------+------------+----------+
| employee_id | first_name | last_name | hire_date | salary |
+-------------+-------------+-------------+------------+----------+
| 179 | Charles | Johnson | 2000-01-04 | 6200.00 |
| 113 | Luis | Popp | 1999-12-07 | 6900.00 |
| 119 | Karen | Colmenares | 1999-08-10 | 2500.00 |
| 178 | Kimberely | Grant | 1999-05-24 | 7000.00 |
| 107 | Diana | Lorentz | 1999-02-07 | 4200.00 |
| 118 | Guy | Himuro | 1998-11-15 | 2600.00 |
| 126 | Irene | Mikkilineni | 1998-09-28 | 2700.00 |
| 177 | Jack | Livingston | 1998-04-23 | 8400.00 |
| 176 | Jonathon | Taylor | 1998-03-24 | 8600.00 |
...
总结
- 使用
ORDER BY
子句对SELECT
子句返回的行进行排序。 - 使用
ASC
选项按升序对行进行排序,使用DESC
选项按降序对行进行排序。