# P20 20. 基础-SQL-DQL-分页查询

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

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

## P20 20. 基础-SQL-DQL-分页查询

- 原视频：https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=20（p=20），时长 5:34
- 讲义：2.6.7 分页查询 p48（公开镜像；按主题对应，切点 notexact）

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

### 一句话理解

LIMIT 让查询只返回一段连续的行，用来做“第几页”。

### 步骤

1. 写 LIMIT 起始索引, 查询记录数；起始索引是“跳过多少行”，从 0 开始数。
2. 换算页码：起始索引 =（页码 − 1）× 每页条数。第 2 页每页 10 条就是 LIMIT 10, 10。
3. 第一页可以省略起始索引，直接 LIMIT 10；但这种省略只在第一页成立。
4. 分页前先写 ORDER BY，否则每次“跳过”的可能不是同一批行。

### SQL 示例

```
SELECT id, name
FROM employee
ORDER BY id
LIMIT 2, 2;
```

说明：【原创演示】四行练习数据按 id 升序是 1、2、3、4。LIMIT 2,2 表示跳过前 2 行再取 2 行，所以返回 id 3（小陈）和 id 4（小李）。如果写成 LIMIT 2 则只取前 2 行，含义完全不同。

### 易错点

- 把起始索引当页码：LIMIT 2, 5 是“跳过 2 行取 5 行”，不是“第 2 页”。
- 不带 ORDER BY 就翻页：数据库没有义务保持行序，第 2 页可能出现第 1 页已经出现过的行。
- 以为 LIMIT 是通用写法：分页是各数据库的方言，其它库用 TOP、FETCH 或 ROWNUM。

### 30 秒速记

LIMIT 偏移, 条数；偏移 =（页码−1）×每页条数；第一页可只写条数；分页必须配 ORDER BY。

### 自测

1. 每页 5 条，要第 3 页，LIMIT 后面写什么？
   - 答：LIMIT 10, 5。（3−1）×5 = 10，跳前两页共 10 行，再取 5 行。
2. 既然 LIMIT 能截断，为什么还强调先 ORDER BY？
   - 答：LIMIT 只按数据库返回的顺序截取，而没写 ORDER BY 时这个顺序不确定；同一句 SQL 两次执行可能截到不同的行。

### 材料与来源

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

证据说明：按 t30/t40/t50/tend 帧核对：画面为“DQL-分页查询 1.语法”，语法行是 SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数；页内注明起始索引从 0 开始、等于（页码−1）×每页记录数、第一页可简写 limit 10、分页是数据库方言。无字幕，讲师口述与演示结果未核实，小例与数字为原创。
