oracle 使用rownum的三种分页方式

下面来详细讲解“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日

相关文章

  • 三、ADO.Net基础【02】ADO.Net连接MySQL

    1.MySQL连接 准备工作   安装MySQL的.Net驱动mysql-connector-net-***.msi添加到项目的库中。新建项目,添加引用→“扩展”,添加Mysql.Data;如果是直接解压版,然后直接添加对MySql.Data.dll文件的引用;(安装后,每次连接mysql数据 库时都要添加Mysql.Data.dll程序集的引用。) 附:驱…

    MySQL 2023年4月13日
    00
  • spring-data-redis版本冲突引发的问题

    1.昨天在maven build项目中发现有个问题,如下所示 java.lang.NoSuchMethodError: org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource.<init>(Lorg/springframework/cor…

    Redis 2023年4月12日
    00
  • Spring Boot集成Druid出现异常报错的原因及解决

    下面就是详细讲解Spring Boot集成Druid出现异常报错的原因及解决的完整攻略。 问题背景 在Spring Boot中使用Druid连接池时,有可能会出现以下异常错误: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with …

    database 2023年5月18日
    00
  • 高性能的内网穿透工具frp使用场景

    针对“高性能的内网穿透工具frp使用场景”的完整攻略,以下是详细讲解: frp简介 frp是一款高性能的内网穿透工具,主要用于将内网应用映射到公网上,让公网用户可以访问内网应用。它支持多种协议转换,配置简单,性能稳定,被广泛应用于各种场景中,例如: 内网web应用的公网访问; 内网消息队列的跨网访问; 内网数据库的公网访问等。 frp的使用场景 内网web服…

    database 2023年5月22日
    00
  • node读取MySQL数据

    var Client = require(‘mysql’).createConnection({ host:’127.0.0.1′, user:’root’, password:’root’, database: ‘angular’, charset:’UTF8′ }) console.log(‘Connecting to MySQL…’); http …

    MySQL 2023年4月12日
    00
  • mysql5.7.13.zip安装教程(windows)

    下面是MySQL5.7.13在Windows系统上的安装教程。 下载MySQL5.7.13.zip 首先从MySQL官网(https://dev.mysql.com/downloads/mysql/)下载MySQL 5.7.13的zip文件。 解压缩zip文件 将下载的zip文件解压缩到任意目录下,比如D:\mysql\。 新建my.ini文件 在MySQL…

    database 2023年5月22日
    00
  • Navicat Premium连接到Centos服务器上的Mysql

    1.如何通过本地连接到云服务器上的数据库? 我的配置如下: 客户端:Navicat Premium    服务器:阿里云ECS服务器中的Centos7.6系统 2.配置云服务器上的端口,也就是我们要在服务器那里打开我们要访问的端口,让外部可以访问才能连接上我们的数据库,数据库的端口默认是3306,配置步骤如下: 一、在阿里云服务器ECS控制台的安全组- -&…

    MySQL 2023年4月12日
    00
  • Linux 集群技术

    Linux 集群技术详解 什么是 Linux 集群技术? Linux 集群技术是利用多台计算机(通常是服务器)组成一个集群,以达到提高系统可用性、可扩展性、负载均衡等目的。这些计算机之间通过网络通信进行交互,并共享数据和资源。 常见的 Linux 集群技术 Linux 集群技术有很多种,常见的包括: 1. 负载均衡集群 负载均衡集群的目的是将请求分布到多台服…

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