一、核心思想
一句话概括:LIMIT 用于从查询结果中截取指定范围的行,实现"取前 N 条"、"分页显示"、"取第 N 条"等功能。
本质:控制返回结果集的行数,减少数据传输量,提升查询效率。
二、语法分类
1. 单参数用法
LIMIT count
| LIMIT 5 | 返回前 5 条 |
| LIMIT 10 | 返回前 10 条 |
2. 双参数用法(两种写法等价)
— 写法1:逗号分隔(老式)
LIMIT offset, count
— 写法2:OFFSET 关键字(新式,更清晰)
LIMIT count OFFSET offset
| LIMIT 0, 5 | 跳过 0 条,取 5 条 | LIMIT 5 OFFSET 0 |
| LIMIT 5, 10 | 跳过 5 条,取 10 条 | LIMIT 10 OFFSET 5 |
| LIMIT 10, 5 | 跳过 10 条,取 5 条 | LIMIT 5 OFFSET 10 |
3. 两种用法的本质
双参数 LIMIT offset, count 是唯一真正的语法。单参数 LIMIT count 只是双参数 LIMIT 0, count 的简写。
LIMIT 5 — 等价于
LIMIT 0, 5 — 等价于
LIMIT 5 OFFSET 0
三、执行流程
1. SQL 执行顺序
FROM → 确定数据来源
WHERE → 筛选行(分组前)
GROUP BY → 分组
HAVING → 筛选组(分组后)
SELECT → 选择列
ORDER BY → 排序 ← LIMIT 在这之后执行!
LIMIT → 截取行 ← 最后执行
2. LIMIT 的执行时机
完整结果集(所有满足条件的行)
↓
ORDER BY 排序
↓
跳过 offset 条(跳过)
↓
取 count 条(取出)
↓
返回最终结果
重要:LIMIT 是在 ORDER BY 之后执行的,所以必须先用 ORDER BY 确定顺序,再用 LIMIT 截取。
四、使用方法
1. 取前 N 条
— 取前 5 个用户
SELECT * FROM users LIMIT 5;
— 取 token 最多的前 3 个用户
SELECT user_id, SUM(tokens) AS total
FROM prompts
GROUP BY user_id
ORDER BY total DESC
LIMIT 3;
2. 分页查询
— 每页 10 条
— 第 1 页:LIMIT 0, 10
— 第 2 页:LIMIT 10, 10
— 第 3 页:LIMIT 20, 10
— 第 N 页:LIMIT (N-1)*M, M
公式:
LIMIT (页码 – 1) * 每页条数, 每页条数
3. 取第 N 条
— 取第 3 条:LIMIT 2, 1
— 取第 5 条:LIMIT 4, 1
— 取第 N 条:LIMIT N-1, 1
公式:
LIMIT N-1, 条数
4. 取倒数 N 条
— 取最后 3 个用户
SELECT * FROM users ORDER BY user_id DESC LIMIT 3;
— 取倒数第 3 到第 1 条
SELECT * FROM users ORDER BY user_id DESC LIMIT 3;
5. 取第 N 到第 M 条
— 取第 3 到第 7 条(共 5 条)
SELECT * FROM users ORDER BY user_id LIMIT 2, 5;
公式:
— 取第 start 条到第 end 条
LIMIT start-1, end-start+1
五、使用场景
| 排行榜 | 取积分前 10 名 | ORDER BY score DESC LIMIT 10 |
| 分页列表 | 用户列表第 2 页 | LIMIT 10, 10 |
| 取第 N 名 | 第 3 名用户 | LIMIT 2, 1 |
| 随机抽样 | 随机取 5 条 | ORDER BY RAND() LIMIT 5 |
| 最新数据 | 最新的 10 条订单 | ORDER BY created_at DESC LIMIT 10 |
| 数据导出 | 分批导出 1000 条 | LIMIT offset, 1000 |
| 删除/更新前 N 条 | 删除前 5 条日志 | DELETE FROM logs LIMIT 5 |
六、核心速查表
| 前 10 条 | LIMIT 10 |
| 第 1 页(每页 10 条) | LIMIT 0, 10 |
| 第 3 页(每页 10 条) | LIMIT 20, 10 |
| 第 N 页(每页 M 条) | LIMIT (N-1)*M, M |
| 第 1 条 | LIMIT 0, 1 |
| 第 3 条 | LIMIT 2, 1 |
| 第 N 条 | LIMIT N-1, 1 |
| 第 3 到第 7 条 | LIMIT 2, 5 |
| 最后 3 条 | ORDER BY id DESC LIMIT 3 |
| 随机 5 条 | ORDER BY RAND() LIMIT 5 |
| 跳过 5 条取 10 条 | LIMIT 5, 10 或 LIMIT 10 OFFSET 5 |
七、注意事项(重要!)
1. LIMIT 必须在 ORDER BY 之后
— 正确
SELECT * FROM users ORDER BY user_id LIMIT 10;
— 错误
SELECT * FROM users LIMIT 10 ORDER BY user_id;
2. 大数据量分页性能问题
— ❌ 性能差:偏移量越大,越慢
SELECT * FROM users LIMIT 100000, 10;
— ✅ 优化:使用主键条件
SELECT * FROM users
WHERE user_id > 100000
ORDER BY user_id
LIMIT 10;
3. ORDER BY 必须有唯一列保证排序稳定
— ⚠️ 可能不稳定(user_id 可能重复)
SELECT * FROM orders ORDER BY user_id LIMIT 10;
— ✅ 稳定:加入唯一列
SELECT * FROM orders ORDER BY user_id, order_id LIMIT 10;
4. 子查询中的 LIMIT 限制
某些版本不支持在子查询的 IN 中使用 LIMIT:
— 可能报错
SELECT * FROM users
WHERE user_id IN (SELECT user_id FROM prompts LIMIT 5);
— 使用 JOIN 替代
SELECT u.*
FROM users u
JOIN (SELECT DISTINCT user_id FROM prompts LIMIT 5) p
ON u.user_id = p.user_id;
5. OFFSET 从 0 开始
LIMIT 0, 1 — 第 1 条(偏移量 0)
LIMIT 1, 1 — 第 2 条(偏移量 1)
LIMIT 2, 1 — 第 3 条(偏移量 2)
八、记忆口诀
LIMIT a, b
a = 跳几个(偏移量从 0 开始)
b = 拿几个(返回行数)
返回:第 a+1 条 到 第 a+b 条
分页公式:LIMIT (页数-1)*每页条数, 每页条数
取第 N 条:LIMIT N-1, 1
九、一句话总结
LIMIT 是在 ORDER BY 排序之后,从结果集中跳过 offset 行,再取 count 行,用于实现分页、排行榜、取第 N 条等所有"需要截取结果集"的场景。核心是控制返回的行数。
