SQLite 的 LIMIT 子句 用于限制查询返回的行数,常与 ORDER BY 配合实现分页、取 Top N、采样等功能。
。
基本语法
SELECT ... FROM table_name
[WHERE ...]
[ORDER BY ...]
LIMIT row_count [OFFSET offset_count];
| 部分 | 说明 |
|---|---|
LIMIT n | 返回最多 n 行 |
LIMIT n OFFSET m | 跳过前 m 行,返回接下来的 n 行 |
LIMIT m, n | 等价于 LIMIT n OFFSET m(部分客户端支持) |
示例表结构
CREATE TABLE sales (
id INTEGER PRIMARY KEY,
product TEXT,
amount REAL,
sale_date DATE
);
-- 插入 10 条测试数据
INSERT INTO sales (product, amount, sale_date) VALUES
('Laptop', 1200, '2025-11-01'),
('Mouse', 25, '2025-11-01'),
('Keyboard', 80, '2025-11-02'),
('Monitor', 350, '2025-11-02'),
('Webcam', 90, '2025-11-03'),
('USB Hub', 45, '2025-11-03'),
('Headset', 150, '2025-11-04'),
('Speaker', 200, '2025-11-04'),
('Printer', 300, '2025-11-05'),
('Scanner', 280, '2025-11-06');
1. 基础用法:取前 N 条
-- 取销售额最高的 3 笔订单
SELECT product, amount FROM sales
ORDER BY amount DESC
LIMIT 3;
结果:
product | amount
----------|-------
Laptop | 1200
Monitor | 350
Printer | 300
2. 分页查询(LIMIT + OFFSET)
-- 第 1 页(每页 3 条)
SELECT * FROM sales ORDER BY id LIMIT 3 OFFSET 0;
-- 第 2 页
SELECT * FROM sales ORDER BY id LIMIT 3 OFFSET 3;
-- 第 3 页
SELECT * FROM sales ORDER BY id LIMIT 3 OFFSET 6;
简写:
LIMIT 3, 3(部分工具支持)
3. 结合 WHERE 使用
-- 11月3日之后,金额 > 100 的前 2 笔订单
SELECT product, amount, sale_date FROM sales
WHERE sale_date > '2025-11-02' AND amount > 100
ORDER BY amount DESC
LIMIT 2;
4. 取随机 N 条(采样)
-- 随机抽取 3 条记录
SELECT * FROM sales
ORDER BY RANDOM()
LIMIT 3;
5. 防止越界:与 COUNT() 配合
-- 安全分页:总条数
SELECT COUNT(*) AS total FROM sales;
-- 当前页(假设每页 5 条,第 3 页)
SELECT * FROM sales
ORDER BY id
LIMIT 5 OFFSET 10; -- 如果 total < 15,返回空或少量
6. 与聚合函数结合
-- 每月销售额最高的一笔
SELECT
STRFTIME('%Y-%m', sale_date) AS month,
MAX(amount) AS max_sale
FROM sales
GROUP BY month
LIMIT 1;
7. 性能提示
| 建议 | 说明 |
|---|---|
LIMIT + ORDER BY 必须有索引 | ORDER BY id → 建 INDEX ON sales(id) |
OFFSET 越大越慢 | 大分页建议用“游标分页”(如 WHERE id > last_id) |
避免 OFFSET 跳过百万行 | 改用键值分页 |
游标分页(推荐大表)
-- 第一页(假设每页 3 条)
SELECT * FROM sales WHERE id > 0 ORDER BY id LIMIT 3;
-- 下一页(记住最后一个 id = 3)
SELECT * FROM sales WHERE id > 3 ORDER BY id LIMIT 3;
8. 常见错误
| 错误 | 正确 |
|---|---|
LIMIT 3, 0 | 应为 LIMIT 3 OFFSET 0 或 LIMIT 3 |
LIMIT -1 | 无效!SQLite 允许但无意义 |
无 ORDER BY + LIMIT | 结果顺序不稳定 |
-- 错误:结果随机顺序
SELECT * FROM sales LIMIT 3;
-- 正确:确定性结果
SELECT * FROM sales ORDER BY id LIMIT 3;
快速参考
| 需求 | SQL |
|---|---|
| 前 5 条 | LIMIT 5 |
| 第 2 页(每页 10) | LIMIT 10 OFFSET 10 |
| 最高金额 | ORDER BY amount DESC LIMIT 1 |
| 随机 1 条 | ORDER BY RANDOM() LIMIT 1 |
| 跳过前 100 条 | LIMIT 999999 OFFSET 100 |
最佳实践
- 永远搭配
ORDER BY→ 确保结果可复现 - 大分页用键值游标 → 避免
OFFSET性能陷阱 - 前端显示总页数 →
SELECT CEIL(COUNT(*)/page_size) - 测试边界 →
OFFSET超出时返回空
需要我帮你写一个针对你表的 LIMIT 分页查询吗?
请提供表名、排序字段、每页条数!