SQLite Limit 子句

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 0LIMIT 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

最佳实践

  1. 永远搭配 ORDER BY → 确保结果可复现
  2. 大分页用键值游标 → 避免 OFFSET 性能陷阱
  3. 前端显示总页数SELECT CEIL(COUNT(*)/page_size)
  4. 测试边界OFFSET 超出时返回空

需要我帮你写一个针对你表的 LIMIT 分页查询吗?
请提供表名、排序字段、每页条数!

文章已创建 2305

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部