SQL 数据库分页
在 SQL 数据库中实现分页,首先需要明确几个关键步骤。首先,你需要确定每页显示的数据条数,这通常是自定义的。其次,需要获取当前选择的页码,这将决定从总数据中跳过多少条记录。有了这些信息,构建 SQL 查询就变得简单了。
以下是一个示例 SQL 语句:
SELECT TOP 10 * FROM tableName WHERE (id NOT IN (SELECT TOP 20 * FROM tableName ORDER BY Id DESC)) OR Id > (当前页码 - 1) * 每页显示数量 ORDER BY Id DESC
这里的参数说明如下:
- 每页显示的数量:根据需要设定,例如 10 条。
- 总页数:总数据条数除以每页显示的条数。
- 当前页码的计算:从客户端获取的页码减 1(如第 3 页传为 3,计算为 2),然后乘以每页显示的条数(例如 10),得到需要跳过的记录数(如 20)。
在 SQL 语句中, TOP 10
代表每页显示 10 条数据,NOT IN (SELECT TOP 20 ...)
这部分则是跳过前 20 条,从而查询第 21 到第 30 条数据。理解了 SQL 的逻辑,分页操作就不再是难题了。
求一个分页 SQL 语句,要求不占用服务器内存的!
1. 分页方案一(利用 Not In 和 SELECT TOP 分页)
语句形式:
SELECT TOP 10 * FROM TestTable WHERE (ID NOT IN (SELECT TOP 20 id FROM TestTable ORDER BY id)) ORDER BY ID2. 分页方案二(利用 ID 大于多少和 SELECT TOP 分页)
语句形式:
SELECT TOP 10 * FROM TestTable WHERE (ID > (SELECT MAX(id) FROM (SELECT TOP 20 id FROM TestTable ORDER BY id) AS t)) ORDER BY ID3. 分页方案三(利用 SQL 的游标存储过程分页)
CREATE PROCEDURE SqlPager @sqlstr NVARCHAR(4000), -- 查询字符串 @currentpage INT, -- 第 N 页 @pagesize INT -- 每页行数 AS BEGIN SET NOCOUNT ON; DECLARE @P1 INT, -- P1 是游标的 id @rowcount INT; EXEC sp_cursoropen @P1 OUTPUT, @sqlstr, @scrollopt=1, @ccopt=1, @rowcount=@rowcount OUTPUT; SELECT CEILING(1.0*@rowcount/@pagesize) AS 总页数 --,@rowcount AS 总行数, @currentpage AS 当前页 SET @currentpage = (@currentpage - 1) * @pagesize + 1; EXEC sp_cursorfetch @P1, 16, @currentpage, @pagesize; EXEC sp_cursorclose @P1; SET NOCOUNT OFF; END其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。
几种流行的数据库 SQL 分页
SQL Server 分页
第一种分页方法
- pageSize:每页显示多少条数据
- pageNumber:页数,从客户端传来
- totalRecords:表中的总记录数,使用
SELECT COUNT(*) FROM 表名
SQL 语句:
SELECT TOP pageSize * FROM 表名 WHERE id NOT IN (SELECT TOP pages id FROM 表名 ORDER BY id) ORDER BY id第二种分页方法:
SQL 语句:
SELECT TOP pageSize * FROM 表名 WHERE id >= (SELECT MAX(id) FROM (SELECT TOP pages id FROM 表名 ORDER BY id ASC) t)MySQL 分页
SQL 语句:
SELECT * FROM 表名 LIMIT pages, pageSize;Oracle 分页
SQL 语句:
SELECT a.* FROM ( SELECT ROWNUM num, t.* FROM 表名 t WHERE ROWNUM <= pageSize * pageNumber ) a WHERE a.num >= pageSize * (pageNumber - 1);DB2 分页
SQL 语句:
SELECT * FROM ( SELECT 字段1, 字段2, ROWNUM() OVER (ORDER BY 排序字段 ASC) AS rowid FROM 表名 ) AS a WHERE a.rowid >= startPage AND a.rowid < endPage;Access 分页
SQL 语句:
SELECT TOP pageSize * FROM 表名 WHERE id >= (SELECT MAX(id) FROM (SELECT TOP pages id FROM 表名 ORDER BY id ASC) t);在 Oracle 数据库中的分页 SQL 语句怎么写?
前提:
- 分页参数:size = 20, page = 2;
- 没有 order by 的查询;
- 嵌套子查询,两次筛选(推荐使用)。
SQL 语句:
SELECT * FROM ( SELECT ROWNUM AS rowno, t.* FROM DONORINFO t WHERE t.BIRTHDAY BETWEEN TO_DATE('19800101', 'yyyymmdd') AND TO_DATE('20060731', 'yyyymmdd') AND ROWNUM <= 20 * 2 ) table_alias WHERE table_alias.rowno > 20 * (2 - 1);扩展资料:
rownum 总是从 1 开始的,第一条不满足去掉的话,第二条的 rownum 又成了 1,以此类推,因此会导致没有找到任何记录。