对结果集进行排序
通常,使用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”之后。
注意: 当指定多个排序字段时,结果集最初按第一个字段排序,然后按第二个字段排序,依此类推。