SQL 数据库分页,在 Oracle 数据库中的分页 SQL 语句怎么写?

seoxx 2025-01-09 阅读:1

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

这里的参数说明如下:

SQL 数据库分页,在 Oracle 数据库中的分页 SQL 语句怎么写?

  • 每页显示的数量:根据需要设定,例如 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 ID
    

2. 分页方案二(利用 ID 大于多少和 SELECT TOP 分页)

语句形式:

SQL 数据库分页,在 Oracle 数据库中的分页 SQL 语句怎么写?

        SELECT TOP 10 * FROM TestTable 
        WHERE (ID > (SELECT MAX(id) FROM (SELECT TOP 20 id FROM TestTable ORDER BY id) AS t)) 
        ORDER BY ID
    

3. 分页方案三(利用 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 数据库分页,在 Oracle 数据库中的分页 SQL 语句怎么写?

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,以此类推,因此会导致没有找到任何记录。

发表评论:

二维码