SQL分页查询最常用方式是LIMIT+OFFSET(MySQL/PostgreSQL)、OFFSET-FETCH(SQL Server 2012+)、ROW_NUMBER()或FETCH(Oracle),深分页应改用主键范围过滤以提升性能。
SQL分页查询最常用、最直接的方式就是用 LIMIT(MySQL/PostgreSQL)或 TOP + OFFSET(SQL Server)等语法实现。核心思路是:跳过前 N 条记录,再取 M 条。下面以主流数据库为例说明实用写法。
这是最直观的写法,适合中小数据量场景:
LIMIT 每页条数 OFFSET 跳过的条数
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 10;
当页码很大时,用 WHERE + 主键范围过滤比 OFFSET 更高效:
id)且已按该字段排序SELECT * FROM users WHERE id > 10 ORDER BY id LIMIT 10;
id(比如是 9990),再执行:SELECT * FROM users WHERE id > 9990 ORDER BY id LIMIT 10;
标准 ANSI SQL 支持方式,语义清晰:
ORDER BY ... OFFSET N ROWS FETCH NEXT M ROWS ONLY
SELECT * FROM orders ORDER BY order_date DESC OFFSET 40 ROWS FETCH NEXT 20 ROWS ONLY;
ORDER BY,否则报错;OFFSET 同样存在深分页性能问题老版本用 ROWNUM(伪列),但需嵌套子查询;新写法推荐窗口函数:
SELECT * FROM (SELECT t.*, ROW_NUMBER() OVER (ORDER BY id) rn FROM users t) WHERE rn BETWEEN 21 AND 30;(第3页,每页10条)WHERE ROWNUM BETWEEN 21 AND 30,必须先给 ROW_NUMBER 再过滤ORDER BY id FETCH FIRST 10 ROWS ONLY OFFSET 20 ROWS
基本上就这些。选哪种方式,主要看数据库类型和数据规模。小项目用 LIMIT OFFSET 足够;高并发或大数据量系统,建议结合主键/时间戳做游标分页,避免 OFFSET 性能陷阱。