1. 什么是SQL分页查询
SQL分页查询是指从关系数据库表中按照一定规则取出若干条记录的查询方式。在实际开发中,当记录数量非常大时,一次性取出所有记录的效率会很低。此时需要将结果分页展示。SQL语句中通常使用 LIMIT 或 ROWNUM 来实现分页。
2. MySQL 分页查询
2.1 语法
SELECT column_name(s)
FROM table_name
LIMIT offset, count;
LIMIT 用于在查询结果中返回指定的行数。第一个参数指定返回的第一行的偏移量,第二个参数指定返回的记录数。
2.2 示例
查询 user 表中的前10条记录:
SELECT * FROM user LIMIT 0,10;
3. Oracle 分页查询
3.1 语法
SELECT *
FROM
(SELECT rownum AS rn, a.*
FROM (SELECT column_name(s)
FROM table_name
ORDER BY some_column) a
WHERE rownum <= :max_row)
WHERE rn >= :min_row;
ROWNUM 是Oracle数据库中的一个伪列,它是数据读取时自动赋给每一行数据的一个递增的唯一整数。
该语句中将排序后的结果作为子查询进行分页,:min_row 和 :max_row 分别对应返回结果的第一行和最后一行。
3.2 示例
查询 user 表中的第11-20条记录:
SELECT *
FROM
(SELECT rownum AS rn, a.*
FROM (SELECT *
FROM user
ORDER BY id) a
WHERE rownum <= 20)
WHERE rn > 10;
4. SQL Server 分页查询
4.1 SQL Server 2005 及以上版本
SQL Server 2005 及以上版本可以使用 ROW_NUMBER() 函数进行分页查询。
4.1.1 语法
SELECT *
FROM
(SELECT ROW_NUMBER() OVER (ORDER BY some_column) AS RowNum, *
FROM table_name) AS t
WHERE t.RowNum BETWEEN :min_row AND :max_row;
ROW_NUMBER() 将每行数据附上唯一递增的行号,该语句中将排序后的结果作为子查询进行分页。
4.1.2 示例
查询 user 表中的第11-20条记录:
SELECT *
FROM
(SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNum, *
FROM user) AS t
WHERE t.RowNum BETWEEN 11 AND 20;
4.2 SQL Server 2012 及以上版本
SQL Server 2012 及以上版本可以使用 OFFSET 和 FETCH 进行分页查询。
4.2.1 语法
SELECT *
FROM table_name
ORDER BY some_column
OFFSET :offset ROWS
FETCH NEXT :count ROWS ONLY;
以上语句中,OFFSET 指定从查询结果集的第几行开始返回记录,FETCH 指定要返回多少行记录。
4.2.2 示例
查询 user 表中的第11-20条记录:
SELECT *
FROM user
ORDER BY id
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
5. PostgreSQL 分页查询
5.1 语法
SELECT column_name(s)
FROM table_name
ORDER BY some_column
LIMIT :count OFFSET :offset;
其中,LIMIT 用于指定返回的记录数,OFFSET 用于指定返回结果的起始位置。
5.2 示例
查询 user 表中的第11-20条记录:
SELECT *
FROM user
ORDER BY id
LIMIT 10 OFFSET 10;
6. 总结
SQL分页查询是一种获取大量数据时非常实用的方式,我们可以根据具体的数据库类型选择适合自己的语法来实现分页。