oracle 使用rownum的三种分页方式

yizhihongxing

下面来详细讲解“Oracle 使用 ROWNUM 的三种分页方式”的完整攻略。

什么是 ROWNUM

ROWNUM是Oracle中一个伪列(伪列是一个看起来像是表中某个字段、但实际上不是字段、由oracle为其预先设置了值的列),表示被检索出来的数据行的序号,起始值为1,每次增加1。

ROWNUM分页

在Oracle中使用ROWNUM进行分页,要注意结果集是先生成再排序,而ROWNUM值是在排序之后才生成。所以在使用ROWNUM分页时,它是不能直接根据数据行的序号进行翻页的,需要一定技巧。

目前常用的基于ROWNUM进行分页的方式有以下三种:

第一种方式:子查询

子查询方式是通过先进行查询操作,再在结果集上进行ROWNUM的限制,从而得到分页结果。其SQL写法如下:

SELECT 
    * 
FROM 
    (SELECT 
        ROWNUM rn, t.* 
     FROM 
        (SELECT 
            *
         FROM 
            表名
         ORDER BY 
            字段名 ASC/DESC) t
    ) tt 
WHERE 
    tt.rn > (当前页数-1)*每页显示的记录数 
AND 
    tt.rn <= 当前页数*每页显示的记录数;

示例:

假设表名为userinfo,包含idusernameage三个字段,现在需要查看第2页,每页显示5条数据,按照id升序排列,如下所示:

SELECT 
    * 
FROM 
    (SELECT 
        ROWNUM rn, t.* 
     FROM 
        (SELECT 
            *
         FROM 
            userinfo
         ORDER BY 
            id ASC) t
    ) tt 
WHERE 
    tt.rn > 5 
AND 
    tt.rn <= 10;

第二种方式:Oracle 12c 中的 FETCH FIRST

Oracle 12c中新增了一个语法,即 FETCH FIRST n ROWS ONLY,可以直接按照行数限制返回结果集的行数,非常便利。但需要注意的是,这个语法在其他数据库中不一定适用。

其SQL写法如下:

SELECT 
    *
FROM 
    表名 
ORDER BY 
    字段名 ASC/DESC 
FETCH FIRST n ROWS ONLY;

示例:

假设表名为userinfo,包含idusernameage三个字段,现在需要查看第2页,每页显示5条数据,按照id升序排列,如下所示:

SELECT 
    *
FROM 
    userinfo
ORDER BY 
    id ASC 
FETCH FIRST 5 ROWS ONLY 
OFFSET 5 ROW;

第三种方式:ROW_NUMBER()函数

ROW_NUMBER()函数是Oracle中的一个内置函数,可生成一个一组结果集中的行号,支持一些复杂的分页查询。

其SQL写法如下(注意必须使用分号进行多条SQL分隔):

WITH 
    t AS 
    (
        SELECT 
            *
            ,ROW_NUMBER() OVER (ORDER BY 字段名) AS row_num
        FROM 
            表名
    )
SELECT 
    * 
FROM 
    t 
WHERE 
    row_num BETWEEN m AND n;

示例:

假设表名为userinfo,包含idusernameage三个字段,现在需要查看第2页,每页显示5条数据,按照id升序排列,如下所示:

WITH 
    t AS 
    (
        SELECT 
            *
            ,ROW_NUMBER() OVER (ORDER BY id) AS row_num
        FROM 
            userinfo
    )
SELECT 
    * 
FROM 
    t 
WHERE 
    row_num BETWEEN 6 AND 10;

这就是使用ROWNUM进行分页的三种方式。希望对您有帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:oracle 使用rownum的三种分页方式 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • MySQL中distinct和count(*)的使用方法比较

    MySQL中distinct和count()是两个常用的关键字,其中distinct用来返回结果集中不同的值,而count()则用来统计结果集中的行数。在本文中,我将详细讲解这两个关键字在MySQL中的用法及比较。 distinct的使用 在MySQL中,使用distinct关键字可以过滤结果集中重复的值,保留每个不同值的一次出现。其语法如下: SELECT…

    database 2023年5月22日
    00
  • mysql 8.0.18 mgr 搭建及其切换功能

    MySQL 8.0.18 MGR 搭建及其切换功能攻略 本文主要介绍如何在 CentOS 7 上搭建 MySQL 8.0.18 MGR 集群,并演示如何使用 MGR 进行集群节点的切换操作。以下是完整的攻略过程: 1. 安装 MySQL 8.0.18 使用 yum 命令安装 MySQL 8.0.18: sudo yum install mysql-commu…

    database 2023年5月22日
    00
  • oracle锁表该如何解决

    当出现oracle锁表的情况时,我们需要尽快解决该问题,避免影响业务正常运行。下面是解决oracle锁表的完整攻略: 1.查看锁定情况 在Oracle中,我们可以通过以下两个方式查看当前锁定情况:- 使用Oracle自带的视图V$LOCKED_OBJECT查看当前被锁定的对象及锁类型 SELECT OBJECT_NAME, SESSION_ID, LOCKE…

    database 2023年5月21日
    00
  • MySQL下海量数据的迁移步骤分享

    MySQL是一款常用的关系型数据库,随着数据量的增大,一些使用MySQL的项目可能需要进行数据库的迁移。下面分享一下MySQL下海量数据的迁移步骤。 步骤一:备份原数据库 在进行数据库迁移前,务必备份好原数据库,防止数据在迁移过程中丢失。可以使用MySQL自带的命令行工具mysqldump进行备份,具体操作如下: # 备份整个数据库,将数据导出到文件中 my…

    database 2023年5月21日
    00
  • MySQL中几种插入和批量语句实例详解

    MySQL中几种插入和批量语句实例详解 介绍 MySQL是一种流行的关系型数据库管理系统。在MySQL中,插入数据是常见的操作,但是不同的插入方法可能会产生不同的效果。本文将介绍MySQL中几种常见的插入语句和批量语句的使用方法,以及注意事项和示例说明。 VALUES插入语句 VALUES插入语句是MySQL中最基本的插入语句,用于将一个或多个值插入一个表中…

    database 2023年5月21日
    00
  • mysql自动定时备份数据库的最佳方法(windows服务器)

    下面是详细的讲解“mysql自动定时备份数据库的最佳方法(windows服务器)”。 一、背景 在Windows服务器上,MySQL作为一个常用的关系型数据库,我们通常需要定时备份以保证数据安全。但是手动备份很容易出错,所以我们需要采用自动定时备份的方式。 二、最佳方法 通过使用Windows的任务计划程序,我们可以轻松实现MySQL的自动定时备份。 具体步…

    database 2023年5月22日
    00
  • 在SQL Server中使用SQL语句查询一个存储过程被其它所有的存储过程引用的存储过程名

    要查询一个存储过程被哪些其它存储过程引用,在SQL Server中可以使用以下步骤: 使用系统存储过程sp_depends查询被引用的存储过程名 sp_depends <stored_proc_name>; 其中,<stored_proc_name>是要查询的存储过程名。如果该存储过程被引用,则该语句将返回被引用该存储过程的对象列表,…

    database 2023年5月21日
    00
  • java servlet手机app访问接口(三)高德地图云存储及检索

    Java Servlet 手机 App 访问接口(三):高德地图云存储及检索 本教程将教你如何在你的 Java Servlet 手机 App 中使用高德地图云存储及检索服务。高德地图云提供了诸多方便的 API,能够管理和存储大规模的地图数据,支持高效查询、检索等等。我们将使用这些 API 来实现我们的手机 App。 准备工作 为了使用高德地图云的服务,我们需…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部