在 SQL 中获取第m个开始的n条记录方法汇总
在 SQL 中,要获取第m个开始的n条记录,主要取决于你使用的数据库系统和支持的功能。以要获取第10个开始的20条记录为例说明几种常见的方法:
1. 使用 LIMIT
和 OFFSET
适用于 MySQL、PostgreSQL 等支持 LIMIT
的数据库。
SELECT * FROM table_name ORDER BY column_name LIMIT 20 OFFSET 10;
LIMIT 20
表示返回 20 条记录。OFFSET 10
表示跳过前 10 条记录。
2. 使用 ROW_NUMBER()
函数
适用于 SQL Server、Oracle、PostgreSQL 等支持窗口函数的数据库。
SELECT * FROM
(
SELECT *, ROW_NUMBER() OVER (ORDER BY column_name) AS rn FROM table_name
) subquery
WHERE rn > 10 AND rn <= 30;
ROW_NUMBER()
为每一行分配一个唯一的序号。- 通过子查询筛选出指定范围的记录。
3. 使用 FETCH FIRST
和 OFFSET
适用于支持 SQL:2008 标准的数据库,如 SQL Server 和 Oracle 12c。
SELECT * FROM table_name
ORDER BY column_name
OFFSET 10 ROWS
FETCH NEXT 20 ROWS ONLY;
OFFSET 10 ROWS
跳过前 10 条记录。FETCH NEXT 20 ROWS ONLY
获取接下来的 20 条记录。
4. 使用 TOP
和子查询
适用于 SQL Server 中不支持 OFFSET FETCH
的旧版本。
SELECT TOP 20 * FROM
(
SELECT TOP 30 * FROM table_name ORDER BY column_name
) subquery
ORDER BY column_name DESC;
- 内部子查询获取前 30 条记录。
- 外部查询获取最后 20 条记录(即第 11 到第 30 条)。
5. 使用 LIMIT
和 RANK
(SQLite 的变通方法)
SQLite 不支持 OFFSET
时,可以用子查询来实现:
SELECT * FROM table_name
WHERE rowid IN
(
SELECT rowid
FROM table_name
ORDER BY column_name
LIMIT 20 OFFSET 10
);
总结
- 推荐方法:
- 如果你的数据库支持
LIMIT OFFSET
,那是最简单的方法。 - 如果使用 SQL Server,
OFFSET FETCH
和ROW_NUMBER()
是更灵活的选择。 - Oracle 数据库可以用
ROW_NUMBER()
或FETCH
实现。
- 如果你的数据库支持
根据你的数据库环境选择适合的方法即可。