SQL 基础教程
SQL 连接
SQL 高级教程
SQL 参考资料

SQL ORDER BY 子句

在本教程中,您将学习如何对 SQL 中 SELECT 查询返回的数据进行排序。

排序结果集

通常,当您使用 SELECT 语句从表中获取数据时,结果集中的行没有任何特定的顺序。 如果您希望结果集按特定顺序排列,您可以在语句末尾指定 ORDER BY 子句,该子句告诉服务器如何对查询返回的数据进行排序。 默认排序顺序为升序。

语法

ORDER BY 子句用于按升序或降序对查询返回的数据进行排序。 该子句的基本语法可以通过以下方式给出:

SELECT column_list FROM table_name ORDER BY column_name ASC|DESC;

在这里,column_list 是要获取其值的数据库表的列/字段的名称,例如 name, age, country 等,而 column_name 是要排序的列的名称。让我们看看一些例子来展示它是如何工作的。

假设我们的数据库中有一个 employees 表,其中包含以下记录:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      1 | Ethan Hunt   | 2001-05-01 |   5000 |       4 |
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
+--------+--------------+------------+--------+---------+

排序单列

以下 SQL 语句将返回 employees 表中的所有员工,并按 emp_name 列对结果集进行升序排序。

SELECT * FROM employees 
ORDER BY emp_name ASC;

您可以跳过 ASC 选项并简单地使用以下语法。 它返回与上一条语句相同的结果集,因为默认排序顺序是升序:

SELECT * FROM employees 
ORDER BY emp_name;

执行上述命令后,您将获得如下输出:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      1 | Ethan Hunt   | 2001-05-01 |   5000 |       4 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
+--------+--------------+------------+--------+---------+

同样,您可以使用 DESC 选项按降序执行排序。 以下语句将按数字 salary 列按降序排列结果集。

SELECT * FROM employees 
ORDER BY salary DESC;

这一次,您将获得如下所示的结果集:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
|      1 | Ethan Hunt   | 2001-05-01 |   5000 |       4 |
+--------+--------------+------------+--------+---------+

对多列进行排序

您还可以在排序时指定多个列。 但是,在您的表中有一些重复值之前,结果集的更改将不可见。 好吧,让我们来了解一下:

为了更好地理解多列排序,假设我们的数据库中有一个名为 trainees 的表,其中包含以下记录:

+----+------------+------------+-------------+--------+
| id | first_name | last_name  | birth_date  | gender |
+----+------------+------------+-------------+--------+
|  1 | Peter      | Parker     | 1998-03-04  |  M     |
|  2 | Harry      | Potter     | 2001-08-30  |  M     |
|  3 | Peter      | Pan        | 2004-09-19  |  M     |
|  4 | Alice      | Kingsleigh | 1999-07-02  |  F     |
|  5 | John       | Connor     | 2002-01-15  |  M     |
+----+------------+------------+-------------+--------+

如果您仔细查看表格,您会发现我们有一些重复的值。 然而,练习生"Peter Parker"和"Peter Pan"的全名不同,但他们的名字相同。

现在执行以下命令,按 first_name 列对结果集进行排序。

SELECT * FROM trainees 
ORDER BY first_name;

执行后,你会得到如下输出:

+----+------------+------------+-------------+--------+
| id | first_name | last_name  | birth_date  | gender |
+----+------------+------------+-------------+--------+
|  4 | Alice      | Kingsleigh | 1999-07-02  |  F     |
|  2 | Harry      | Potter     | 2001-08-30  |  M     |
|  5 | John       | Connor     | 2002-01-15  |  M     |
|  1 | Peter      | Parker     | 1998-03-04  |  M     |
|  3 | Peter      | Pan        | 2004-09-19  |  M     |
+----+------------+------------+-------------+--------+

现在执行这条语句,它按 first_namelast_name 列对结果集进行排序。

SELECT * FROM trainees 
ORDER BY first_name, last_name;
+----+------------+------------+-------------+--------+
| id | first_name | last_name  | birth_date  | gender |
+----+------------+------------+-------------+--------+
|  4 | Alice      | Kingsleigh | 1999-07-02  |  F     |
|  2 | Harry      | Potter     | 2001-08-30  |  M     |
|  5 | John       | Connor     | 2002-01-15  |  M     |
|  3 | Peter      | Pan        | 2004-09-19  |  M     |
|  1 | Peter      | Parker     | 1998-03-04  |  M     |
+----+------------+------------+-------------+--------+

您是否注意到先前结果集和当前结果集之间的差异 — 这次练习生"Peter Parker"的记录是在"Peter Pan"之后。

由于两个练习生的名字相同,都是"Peter",所以在这两个练习生的 last_name 列进行第二级排序,这就是练习生"Peter Parker"的记录在"Peter Pan"之后的原因。

注意: 当指定多个排序列时,结果集最初按第一列排序,然后该有序列表按第二列排序,依此类推。

Advertisements