SQL ORDER BY 子句
在本教程中,您将学习如何对 SQL 中 SELECT
查询返回的数据进行排序。
排序结果集
通常,当您使用 SELECT
语句从表中获取数据时,结果集中的行没有任何特定的顺序。 如果您希望结果集按特定顺序排列,您可以在语句末尾指定 ORDER BY
子句,该子句告诉服务器如何对查询返回的数据进行排序。 默认排序顺序为升序。
语法
ORDER BY
子句用于按升序或降序对查询返回的数据进行排序。 该子句的基本语法可以通过以下方式给出:
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_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"之后的原因。
注意: 当指定多个排序列时,结果集最初按第一列排序,然后该有序列表按第二列排序,依此类推。