第 6.1 节:LIMIT 和 OFFSET 的关系
考虑以下用户表:
| id | username |
|---|---|
| 1 | User1 |
| 2 | User2 |
| 3 | User3 |
| 4 | User4 |
| 5 | User5 |
为了限制 SELECT 查询结果集中的行数,可以使用 LIMIT 子句,并配合一个或两个正整数作为参数(零也可)。
带一个参数的 LIMIT 子句
当使用一个参数时,结果集将被限制为指定的行数,方式如下:
SELECT * FROM users ORDER BY id ASC LIMIT 2;
结果:
| id | username |
|---|---|
| 1 | User1 |
| 2 | User2 |
如果参数的值为 0,结果集将为空。
另外请注意,ORDER BY 子句对于指定结果集中将显示哪些首行可能很重要(当按其他列排序时)。
带两个参数的 LIMIT 子句
当在 LIMIT 子句中使用两个参数时:
- 第一个参数表示结果集中将从中开始显示行的行号(通常称为偏移量(offset)),因为它表示受限结果集起始行之前的行。这允许该参数接收 0 值,从而考虑非受限结果集的第一行。
- 第二个参数指定结果集中要返回的最大行数(类似于单参数示例)。
因此查询:
SELECT * FROM users ORDER BY id ASC LIMIT 2, 3;
呈现以下结果集:
| id | username |
|---|---|
| 3 | User3 |
| 4 | User4 |
| 5 | User5 |
注意,当偏移量参数为 0 时,结果集等同于单参数 LIMIT 子句。这意味着以下两个查询:
SELECT * FROM users ORDER BY id ASC LIMIT 0, 2;
SELECT * FROM users ORDER BY id ASC LIMIT 2;
产生相同的结果集:
| id | username |
|---|---|
| 1 | User1 |
| 2 | User2 |
OFFSET 关键字:替代语法
带有两个参数的 LIMIT 子句的另一种语法是在第一个参数后使用 OFFSET 关键字,方式如下:
SELECT * FROM users ORDER BY id ASC LIMIT 2 OFFSET 3;
此查询将返回以下结果集:
| id | username |
|---|---|
| 3 | User3 |
| 4 | User4 |
请注意,在这种替代语法中,参数的位置发生了交换:
- 第一个参数表示结果集中要返回的行数。
- 第二个参数表示偏移量。