LIMIT并非所有数据库都支持:MySQL和PostgreSQL用LIMIT n OFFSET m(或MySQL特有LIMIT m,n),SQL Server需用OFFSET m ROWS FETCH NEXT n ROWS ONLY,Oracle 12c+支持同SQL Server语法,旧版则依赖ROWNUM嵌套查询。

LIMIT 不是所有数据库都支持,MySQL 和 PostgreSQL 可用,SQL Server 和 Oracle 需换写法。
MySQL 和 PostgreSQL 中直接用 LIMIT 最简单
这两个数据库对 LIMIT 语法支持一致,写在语句末尾即可:
SELECT * FROM users ORDER BY id DESC LIMIT 10;
这会返回最新 10 条记录。注意:LIMIT 必须放在 ORDER BY 之后,否则排序可能无效;如果没写 ORDER BY,结果顺序不保证。
-
LIMIT 5表示取前 5 行 -
LIMIT 5 OFFSET 10表示跳过前 10 行,再取 5 行(等价于LIMIT 10, 5,但后者仅 MySQL 支持) - PostgreSQL 不接受逗号写法,必须用
OFFSET
SQL Server 要用 TOP 或 OFFSET FETCH
TOP 最常用,但只能用于查询开头,且不支持跳过行数:
SELECT TOP 10 * FROM users ORDER BY id DESC;
如果要做分页(比如第 3 页,每页 10 条),就得用 OFFSET FETCH:
SELECT * FROM users ORDER BY id DESC OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
-
OFFSET是跳过的行数,不是页码,第 3 页要算成OFFSET 20(因为前两页共 20 行) -
FETCH NEXT后必须跟ROWS ONLY,漏掉会报错Incorrect syntax near 'ROWS' - 使用
OFFSET FETCH时,ORDER BY是强制要求,不能省略
Oracle 12c+ 用 FETCH FIRST,旧版本靠 ROWNUM
Oracle 12.1 开始支持标准写法:
SELECT * FROM users ORDER BY id DESC FETCH FIRST 10 ROWS ONLY;
更灵活的分页写法:
SELECT * FROM users ORDER BY id DESC OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
Oracle 11g 或更早版本只能靠嵌套查询 + ROWNUM,但容易出错:
SELECT * FROM (SELECT a.*, ROWNUM rnum FROM (SELECT * FROM users ORDER BY id DESC) a WHERE ROWNUM <= 30) WHERE rnum > 20;
- 外层
WHERE rnum > 20不能直接写成ROWNUM > 20—— 因为ROWNUM是查到就编号,永远从 1 开始,所以必须套两层 - 这个写法性能较差,尤其数据量大时,建议升级到 12c+ 直接用
FETCH FIRST
跨数据库写分页逻辑时,别硬套 LIMIT;不同方言的偏移计算、排序依赖、语法容错性差异很大,最容易出问题的是 OFFSET 值算错或者漏写 ORDER BY —— 这会导致数据重复或丢失。

















