分页查询是数据库开发中非常常见的操作,不同的数据库系统(如 MySQL、PostgreSQL、Oracle、SQL Server 等)有不同的分页语法,以下是几种主流数据库的分页查询 SQL 语句示例:
MySQL / MariaDB
使用 LIMIT 和 OFFSET 关键字。
SELECT FROM table_name ORDER BY id ASC LIMIT page_size OFFSET start_index;
示例: 每页 10 条数据,第 2 页(即从第 11 条开始取 10 条):
SELECT FROM users ORDER BY id ASC LIMIT 10 OFFSET 10;
💡 注意:
OFFSET是从 0 开始计数的,第 1 页 OFFSET=0,第 2 页 OFFSET=10,第 n 页 OFFSET=(n-1)page_size。
PostgreSQL
同样使用
LIMIT 和 OFFSET,语法与 MySQL 类似。
SELECT FROM table_name ORDER BY id ASC LIMIT page_size OFFSET start_index;
示例:
SELECT FROM users ORDER BY id ASC LIMIT 10 OFFSET 10;
Oracle
Oracle 12c 之前使用 ROWNUM,12c 及以上推荐使用 OFFSET ... FETCH NEXT。
✅ Oracle 12c+ 推荐写法:
SELECT FROM table_name ORDER BY id ASC OFFSET start_index ROWS FETCH NEXT page_size ROWS ONLY;
示例:
SELECT FROM users ORDER BY id ASC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
⚠️ Oracle 11g 及以下(使用 ROWNUM):
SELECT FROM ( SELECT a., ROWNUM rn FROM ( SELECT FROM users ORDER BY id ASC ) a WHERE ROWNUM <= 20 ) WHERE rn > 10;
SQL Server
使用 OFFSET ... FETCH NEXT(SQL Server 2012+)或 TOP + NOT IN/ROW_NUMBER()(旧版本)。
✅ SQL Server 2012+ 推荐写法:
SELECT FROM table_name ORDER BY id ASC OFFSET start_index ROWS FETCH NEXT page_size ROWS ONLY;
示例:
SELECT FROM users ORDER BY id ASC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
⚠️ SQL Server 2008 及以下(使用 ROW_NUMBER()):
SELECT FROM (
SELECT , ROW_NUMBER() OVER (ORDER BY id ASC) AS row_num
FROM users
) AS numbered
WHERE row_num BETWEEN 11 AND 20;
SQLite
与 MySQL 类似,使用 LIMIT 和 OFFSET。
SELECT FROM table_name ORDER BY id ASC LIMIT page_size OFFSET start_index;
📌 通用建议
- 始终使用
ORDER BY:分页时必须指定排序字段,否则结果可能不稳定。 - 避免深层分页:当
OFFSET很大时(如第 10000 页),查询性能会显著下降,可考虑使用“游标分页”(基于上一页最后一条记录的 ID):SELECT FROM users WHERE id > last_seen_id ORDER BY id ASC LIMIT 10;
- 索引优化:确保排序字段和过滤条件有合适的索引,以提升分页查询性能。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/481484.html



