SQL ORDER BY

对结果集进行排序

通常,使用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语句选取全部employee,结果按emp_name字段升序排序。

示例

SELECT * FROM employees 
ORDER BY emp_name ASC;

ASC可省略,因为默认排序就是升序/ASC:

类似地,可使用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_name和last_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”之后。

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



浙ICP备17015664号-1 浙公网安备 33011002012336号 联系我们 网站地图  
@2019 qikegu.com 版权所有,禁止转载