oracle——列表分页查询(原理)

news2024/10/8 20:31:08

文章目录

  • 前言
  • 数据表的准备
  • 分页sql
    • 1、简单分页实现
    • 2、排序分页
    • 3、排序优化

前言

在平时的开发中,Oracle的分页查询用的特别多,接下来不止是说使用,更讲分页sql写法的原理。

数据表的准备

创建一张数据表,并填充大量的数据。

create table XJ_TEST_LTOH
(
  stuid      VARCHAR2(20),
  stuname    VARCHAR2(40),
  coursename VARCHAR2(40),
  score      INTEGER
)

并增加数据信息。

insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201001', '张三', '数学', 40);

insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201001', '张三', '语文', 50);

insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201001', '张三', '理综', 120);

insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201011', '李四', '数学', 32);

insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201011', '李四', '语文', 45);

insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201011', '李四', '理综', 123);

insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201031', '王五', '数学', 54);

insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201031', '王五', '语文', 56);

insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201031', '王五', '理综', 100);

执行后,数据表信息如下所示:
在这里插入图片描述

分页sql

1、简单分页实现

Oracle中,分页通常会采用一个叫ROWNUM伪列进行实现。

扩展知识:伪列有 rowid (每条数据的物理地址) 和 rownum (数据的序号) 两种。

正常来说,根据数据表与rownum相结合,就能实现表的分页操作。

select rownum,t.* from xj_test_ltoh t

在这里插入图片描述
比如,只显示第一页的数据,每页显示5条记录数。

select rownum,t.* from xj_test_ltoh t where rownum <= 5

在这里插入图片描述

但是,如果查询第二页呢?

select rownum,t.* from xj_test_ltoh t where rownum <= 10 and rownum >5

执行后,并不会有任何结果。
【原因】:

rownum 只允许使用 < 或者 <=

【注意:】小细节

rownum是在数据逐条扫描的时候,才会生成,如果一开始就指明条件 rownum>10 ,则将导致查询sql语句无效,也就是无数据集。

如何解决上述的问题呢?

可以考虑子查询来进行实现。

既然 rownum 只允许使用<或者<=,那么先查询数据,在做一个 from 子查询,得到的结果附带 rownum 属性值,将rownum值作为一个数据集的列属性(当作一个表的列字段),就能使用 >进行截取了!

select * from 
(select rownum r,t.* from xj_test_ltoh t where rownum <= 10)
where r > 5

或者

select * from 
(select rownum r,t.* from xj_test_ltoh t )
where r > 5 and r <= 10

但是这么写会存在一个bug,先不说bug是什么样的,接下来进行排序后再分页,这个bug就会出现。

2、排序分页

还是上面的表,先根据 score 成绩字段进行降序排序,再进行数据的分页操作。

select rownum r,t.* from xj_test_ltoh t order by t.score desc

但是,发现问题了没有,上面的 rownum 是一个乱序的,并不能满足分页操作。

如何解决上面的问题呢?

依然是先查询,再根据查询到的结果集,通过from子查询绑定rownum,再分页操作。

select rownum r,t2.* from (select * from xj_test_ltoh t order by t.score desc) t2

然后,再进行分页操作

select * from (
select rownum r,t2.* from (select * from xj_test_ltoh t order by t.score desc) t2
)
where r > 5 and r <= 10

3、排序优化

进行sql的编写,还需要考虑到数据特别多的情况下,如何保证高效的查询分页操作。

在上面的sql中,子查询 select rownum r,t2.* from (select * from xj_test_ltoh t order by t.score desc) t2 此处是查询了全表。如果数据量特别大,将导致全表检索,耗时问题。

解决方式也很简单

将全表查询的数据量缩小。

先进行排序但限定查询后的数据范围,再将已经初步缩小范围的查询结果作为集合,再次查询集合继续截取掉无用数据,如下所示sql:

select * from (
  -- 初步缩小范围
  select A.*,rownum rn from(
         select * from xj_test_ltoh order by score desc
  ) A where rownum <= 10
) where rn > 5 -- 再次截取掉无用数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/191015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据技术架构(组件)12——Hive:判断函数

1.4.6、判断函数1.4.6.1、ifselect if(11,a,b),if(12,a,b) ;1.4.6.2、isnullselect isnull(1),isnull(null);1.4.6.3、isnotnullselect isnotnull(1),isnotnull(null);1.4.6.4、nvlselect nvl(1,1),nvl(null,1);1.4.6.5、coalesceselect coalesce(1,null,2,3,null,4,null),coal…

感谢第三弹 | 开启地铁国产化浪潮 GBASE获多方城市“地下动脉”肯定

岁末年初&#xff0c;GBASE收到了来自深圳地铁、高新现代智能系统股份有限公司、深圳达实智能股份有限公司等客户及合作伙伴发来的荣誉证书及感谢信。作为亲密无间的战友&#xff0c;GBASE携手高新现代、达实智能在深圳地铁CLC、ACC、AFC多个条线项目中通力合作&#xff0c;助力…

背包问题学习

01背包 01背包&#xff08;0-1 Knapsack Problem&#xff09; 有NNN件物品和一个容量为VVV的背包。放入第iii件物品耗费的费用是CiC_iCi​,得到的价值为WiW_iWi​。求解将哪些物品装入背包可以使价值总和最大 设F[i,v]F\left[i,v\right]F[i,v]表示前iii件物品敲好放入一个容量…

软件防错设计

出现非预期错误的原因解决方案原理介绍断根原理原理&#xff1a;将可能造成人错误的原因/条件从根本上排除断绝掉。通过冗余设计&#xff0c;屏蔽掉其中9种错误的方式&#xff1b;案例&#xff1a;USB的SD卡防写开关。4种可能性断根设计为只有1种可能是正确的。软件设计&#x…

Linux学习之环境准备【Vm+Centos】

文章目录前言一 VMware Workstation17 Pro下载和安装1.1 Vm下载指南1.2 VM安装指南二 Centos7安装2.1 装机器2.2 装系统三 补充内容3.1 卸载Centos前言 工欲善其事&#xff0c;必先利其器&#xff0c;我们要学习Linux当然需要Linux的环境由于大部分人使用的是Windows系统无法进…

介绍OAuth2

目录 一、什么是OAuth2&#xff1f; 二、OAuth2中的角色 1、资源所有者 2、资源服务器 3、客户 4、授权服务器 三、认证流程 四、OAuth2授权方式 注&#xff1a;使用令牌方式的优点 1、授权码 2、隐藏方式 3、密码方式 4、凭证方式 一、什么是OAuth2&#xff1f…

深入浅出ConcurrentHashMap1.8

前言 HashMap是我们平时开发过程中用的比较多的集合&#xff0c;但它是非线程安全的&#xff0c;在涉及到多线程并发的情况&#xff0c;进行get操作有可能会引起死循环&#xff0c;导致CPU利用率接近100%。 final HashMap<String, String> map new HashMap<String,…

基于Springboot搭建java项目(二十四)——权限认证框架SpringSecurity

权限认证框架SpringSecurity 一、为什么要做权限认证 在WEB开发的过程当中&#xff0c;安全一直是很重要的一方面。安全和直接的业务是没有直接挂钩的&#xff0c;但是在业务实现的初期如果没有考虑的安全性的化&#xff0c;在后期迭代的时候就会出现很多的问题。例如存在着安…

4.1--贪心--活动安排问题

今天开始&#xff0c;快速过一遍贪心&#xff0c;贪心要比动态规划简单许多&#xff0c;但是&#xff0c;我们也要理解其中的证明过程 贪心算法采用自顶向下&#xff0c;以迭代的方法做出相继的贪心选择&#xff0c;每做一次贪心选择就将所求问题简化为一个规模更小的子问题&am…

Maven实战-3.setting.xml标签说明

前言 持续更新中… setting.xml文件 1.<localRepository> 自定义本地Maven仓库目录地址。 这样本地的仓库地址就是配置的目录了。 2.<proxies> 基于安全因素考虑&#xff0c;使用通过安全认证的代理访问因特网&#xff0c;这时候需要为Maven配置HTTP代理&…

TOOM大数据舆情监控系统方案,如何做好舆情大数据监测分析?

大数据舆情监控是指通过对大量数据的收集、分析和处理&#xff0c;了解舆论的发展趋势和活动&#xff0c;并对舆论风险进行预警和评估&#xff0c;以保障企业的舆论安全。TOOM大数据舆情监控系统方案&#xff0c;如何做好舆情大数据监测分析? 一、大数据舆情监控系统方案 1.…

车载以太网 - SomeIP - SomeIP Entry - 04

前面总纲内容有说,车载以太网中的SomeIP内容是非常多的,并且为了实现SOA的相关需求,提供了多种多样的报文类型,因此也就有了今天要说的SomeIP-SD中的重要组成部分之一的条目(Entry)部分,而SomeIP-SD在车载网络中占有相当大的比重,可以当做是一定要实现的,如果这块不实…

C语言知识点复习------排序法(冒泡、选择、插入)与链表

目录 排序 冒泡排序&#xff1a; 选择排序&#xff1a; 插入排序&#xff1a; 链表 单链表的建立 单向循环链表的建立 双向循环链表 排序 冒泡排序&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简单直观的排序算法。它重复地走访过要排序的数列&a…

RK356X系列(RK3568)GL857L芯片 USB驱动开发

首先我们先区分一下USB几种控制器类型协议 OHCI UHCI EHCI xHCI。OHCI、UHCI都是USB1.1的接口标准&#xff0c;而EHCI是对应USB2.0的接口标准&#xff0c;最新的xHCI是USB3.0的接口标准。1. OHCI&#xff08;Open Host Controller Interface&#xff09;是支持USB1.1的标准&…

C++ | 数据结构与算法 | 单源最短路径 | Dijkstra Bellman Ford

文章目录前言Dijkstra算法讲解与实现Bellman Ford算法与实现前言 &#xff08;关于代码实现的图结构&#xff0c;可以看图结构的实现这篇文章&#xff09; Dijkstra的实现与Prim的实现相似&#xff0c;两者都是通过贪心思想实现&#xff0c;它们有什么不同呢&#xff1f;首先…

数字IC设计工程师一般都干什么

数字IC设计工程师一般都干什么 简单来说&#xff0c;数字IC设计工程师一般就是负责写verilog代码&#xff08;当然&#xff0c;不是仅仅写个代码&#xff09;。本文主要对数字IC设计的工作流程进行简单的介绍&#xff0c;也算是对我从业一年来的总结。 一般来说&#xff0c;数…

linux下的僵尸进程处理SIGCHLD信号

阅读目录 对于waitpid的p i d参数的解释与其值有关&#xff1a;wait与waitpid区别&#xff1a; 转自&#xff1a;linux下的僵尸进程处理SIGCHLD信号 - Jessica程序猿 - 博客园 什么是僵尸进程&#xff1f; 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区&am…

Java——字母大小写全排列

题目链接 字母大小写全排列 题目描述 给定一个字符串 s &#xff0c;通过将字符串 s 中的每个字母转变大小写&#xff0c;我们可以获得一个新的字符串。 返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。 题目示例 输入&#xff1a;s “a1b2” 输出&#xff1a…

spring-boot国际化i18n中英文实现

一、背景 接触到的项目&#xff0c;使用国际化越来越多&#xff0c;系统页面实现中英文环境&#xff0c;记录下&#xff0c;前端使用vue vue-i8n 后端java自己封装 前端翻译对象&#xff1a;页面涉及到的所有按钮&#xff08;包括新增、删除、导出、下载、导入、上一页、下…

相控阵天线分析综合、设计与测试

目录概述HFSS特殊曲线天线建模直线阵列天线特性和阵列因子&#xff08;方向图乘积定理、波束扫描&#xff09;非规则直线阵列天线&#xff08;稀布阵列、稀疏阵列、平方率分布阵列&#xff09;直线阵列天线低副瓣综合&#xff08;切比雪夫、泰勒分布、SinZ-Z和Villeneuve分布&a…