课程 2.5: 排序结果
默认情况下,数据库表中的行或查询结果集中的行并不保证以任何特定顺序排列。为了以有意义的顺序排列输出行,我们使用 ORDER BY 子句。
ORDER BY 子句
ORDER BY 子句被添加到 SELECT 语句的末尾,以根据一个或多个列对结果集进行排序。
语法
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
column1, column2, ...: 你想要排序的列。ASC: 以升序排列数据(从最低到最高,从 A 到 Z)。这是默认值。DESC: 以降序排列数据(从最高到最低,从 Z 到 A)。
按单列排序
要按一列排序,只需在 ORDER BY 关键字后指定其名称。
示例:按姓氏排序演员
此查询检索所有演员,并按其姓氏的字母顺序进行排序。
SELECT first_name, last_name
FROM actor
ORDER BY last_name;
如果你想按反向字母顺序排序:
SELECT first_name, last_name
FROM actor
ORDER BY last_name DESC;
按多列排序
你可以通过用逗号分隔列名来按多列排序。数据库首先按第一列排序,如果该列中有重复值,则按第二列对这些重复值进行排序,依此类推。
示例:先按姓氏排序,再按名字排序
当多个演员共享相同的姓氏时,这非常有用。
SELECT first_name, last_name
FROM actor
ORDER BY last_name, first_name; -- 先按 last_name 排序,然后按 first_name 排序以解决冲突
按表达式排序
你不仅可以按原始列排序,还可以按表达式排序。SQL 首先为每一行计算表达式(例如,数值、文本或布尔结果),然后 ORDER BY 使用这些计算结果作为排序键对行进行排序。
示例 1:按数值表达式排序
按租赁时长(rental_duration / 7)排序电影:
SELECT title, rental_duration
FROM film
ORDER BY rental_duration / 7 DESC;
示例 2:按文本表达式排序
按全名不区分大小写地排序演员:
SELECT first_name, last_name
FROM actor
ORDER BY LOWER(first_name || ' ' || last_name);
示例 3:按布尔表达式排序
将评级为 'G' 的电影放在最前面:
SELECT title, rating
FROM film
ORDER BY (rating = 'G') DESC, title;
布尔排序在不同的 SQL 方言中可能有所不同。为了实现完全可移植的行为,请使用 CASE:
SELECT title, rating
FROM film
ORDER BY CASE WHEN rating = 'G' THEN 0 ELSE 1 END, title;
按列别名或位置排序
在大多数 SQL 方言中,你还可以按列的别名或其在 SELECT 列表中的数字位置进行排序。
示例:按别名排序
SELECT first_name || ' ' || last_name AS full_name
FROM actor
ORDER BY full_name;
示例:按位置排序
-- 按第二列(last_name)排序
SELECT first_name, last_name
FROM actor
ORDER BY 2;
本课的关键要点:
- 使用
ORDER BY对结果集中的行进行排序。 ASC(默认)按升序排序;DESC按降序排序。- 你可以按多列进一步细化排序顺序。
- 你可以按返回数值、文本或布尔结果的表达式进行排序。
- 也可以使用列别名或数字位置进行排序。
在下一课中,我们将学习 聚合函数,它允许我们对数据集进行计算。