🙏 感谢您的支持! 我们在七月份已经筹集了 $65 — 这足够我们工作到下个月。请帮助我们保持进度,进一步支持这个项目。 支持这个项目 →
SQL 代码已复制到剪贴板

课程 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 按降序排序。
  • 你可以按多列进一步细化排序顺序。
  • 你可以按返回数值、文本或布尔结果的表达式进行排序。
  • 也可以使用列别名或数字位置进行排序。

在下一课中,我们将学习 聚合函数,它允许我们对数据集进行计算。

尝试解决以下任务,以巩固您在本课中学到的内容。

  1. 有序电影标题
  2. 有序语言列表
  3. 获取客户列表
  4. 列出部门
  5. 列出唯一客户