# P19 19. 基础-SQL-DQL-排序查询

> 本页是学习笔记，不等同于视频逐字稿。原声字幕未取得（匿名接口字幕轨为空且需登录，未使用任何账号），也没有逐句讲解记录；讲义只按节与页码对应，切点未逐句确证。

> 以同版讲义的公开镜像核对章节与页码（镜像非官方出品）；非逐字稿，示例为原创补充。

## P19 19. 基础-SQL-DQL-排序查询

- 原视频：https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=19（p=19），时长 6:36
- 讲义：2.6.6 排序查询 p47–48（公开镜像；按主题对应，切点 notexact）

- 本集练习数据：practice/p19.sql（先执行，再对照小例）

### 一句话理解

ORDER BY 决定结果按什么顺序排；不写它，数据库给出的行序没有任何保证。

### 步骤

1. 在查询末尾写 ORDER BY 字段名，默认升序 ASC；要降序就在字段后补 DESC。
2. 多列排序从左往右生效：第一列相同的行，才用第二列继续分先后。
3. 排序可以按别名或表达式做，因为这一步发生在结果列确定之后，别名在这里能用。
4. 需要“稳定的翻页顺序”时，末尾补一个唯一列（如 id）当兜底。

### SQL 示例

```
SELECT id, name, salary
FROM employee
ORDER BY salary DESC, id ASC;
```

说明：【原创演示】仍用那四行练习数据。salary 降序：小陈 12000、小周 10000、小林 8000；小李的 salary 是 NULL，在 MySQL 的降序排序里排在最后。第二列 id 只在薪资相同时才起作用，本例没有并列，所以结果顺序是 3、2、1、4。

### 易错点

- 以为 ORDER BY 会改变表里的存储顺序：它只影响这次查询返回的顺序，表里行的物理次序没有变。
- 把 ORDER BY salary, id DESC 当成整体降序：DESC 只跟着紧邻的那一列，第一列仍是升序。
- 排序用了可空列又不看默认位置：升序 NULL 在最前，降序 NULL 在最后，容易误判“最小值”。

### 30 秒速记

ORDER BY 列 [ASC|DESC]，默认升序；多列从左到右；NULL 升序在前、降序在后；翻页要加唯一列兜底。

### 自测

1. ORDER BY salary DESC, id 里的 id 没写 ASC，为什么也按升序？
   - 答：ASC 是默认排序方式，省略即升序；只有需要降序时才必须写 DESC。
2. 按薪资排序后为什么还要加 id？
   - 答：薪资相同的行之间没有规定先后，数据库每次返回的顺序可能不同；只有加唯一列，顺序才确定，翻页才不会重复或漏行。

### 材料与来源

- [平台视频页] P19 原视频页（BV1Kr4y1i7ru） https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=19
- [官方文档] MySQL 8.0 Reference：SELECT … ORDER BY https://dev.mysql.com/doc/refman/8.0/en/select.html

证据说明：已核对前半段画面，后半演示未取得；排序规则的小例为原创补充。前半段指 t012 的 DQL 目录页与 t020 的“DQL-排序查询 1.语法”页（语法行为 SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2）；采样帧止于 t050≈198s，全片 396s，故讲师后半段的演示 SQL 与查询结果未核实，正文也不引用任何课堂数值。无字幕。
