Oracle数据库之oracle简单查询之分页查询
小标 2019-01-16 来源 : 阅读 1946 评论 0

摘要:本文主要向大家介绍了Oracle数据库之oracle简单查询之分页查询,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助。

本文主要向大家介绍了Oracle数据库之oracle简单查询之分页查询,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助。


分页查询

1、为什么需要分页?


 当数据库的数据过的时候,客服端无法一次性显示所有数据,例如我们数据库表里有十万条数据,如果一下加载,查询的速度慢,用户体验差,而且用户也不可能一次性读完这个十万条数据

2、分页技术分类


物理分页(推荐)

在数据库执行查询时(实现分页查询),查询需要的数据依赖数据库SQL语句,属于后台分页

逻辑分页

先查询所有数据到内存,再从内存截取需要数据采用程序内部逻辑,属于前台分页


3、ORACLE实现

2.1、说明


 ORACLE分页采用ROWNUM

2.2 、语法格式


格式1(推荐)

SELECT * FROM   
(  
SELECT temp.*, ROWNUM RN   
FROM (SELECT * FROM 表名) temp  
WHERE ROWNUM <=end (page*pagesize)  
)  
WHERE RN >=start (page-1*pagesize+1)

格式2

SELECT * FROM   
(  
SELECT temp.*, ROWNUM RN   
FROM (SELECT * FROM TABLE_NAME) temp   
)  
WHERE RN BETWEEN start (page-1*pagesize+1) AND end (page*pagesize)  


2.3、效率对比


 CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第2个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。 而第1个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第1个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多.

2.4、ROWNUM介绍

1、ROWNUM原理


执行查询操作
将第一行的row num置为1
将得到的行的rownum与条件相比较,如果不匹配,则抛弃行,如果匹配,则返回行
oracle获取下一行,然后将rownum增1
返回第3步


2、示例代码


使用rownum<查询数据

select rownum,emp.* from emp where rownum < 5;

说明:对于查询返回的每一行,使用rownum伪列返回一个数字,表示oracle从表中选择行或将加入行的顺序。选择的第一行rownum为1,第二行为2,以此类推。

使用rownum >来查询一下数据

select rownum,emp.* from emp where rownum > 5;

说明: 发现该查询无返回任何数据,原因是第一行读取被分配为1,rownum>1使得条件为假,接着读取第二行现在变为第一行,并还分配为1,rownum使得条件依然是假,所有行随后均未能满足该条件,所以没有行被返回

rownum大于一个正整数来查询,必须使用子查询来实现

SELECT * FROM   
(  
SELECT temp.*, ROWNUM RN   
FROM (SELECT * FROM emp) temp  
WHERE ROWNUM <=15
)  
WHERE RN >=11

使用 BETWEEN 最小数 AND 最大数 实现

SELECT * FROM   
(  
SELECT temp.*, ROWNUM RN   
FROM (SELECT * FROM emp) temp   
)  
WHERE RN BETWEEN 10 AND 15


3、使用注意事项


rownum不能以任何基表的名称作为前缀。   
子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。   
查询rownum在某区间的数据,rownum对小于某值的查询条件为true,rownum对于大于某值的查询条件直接认为是false的,但是可以间接的让它转为认为是true的。那就必须使用子查询。

   

本文由职坐标整理并发布,希望对同学们学习Oracle有所帮助,更多内容请关注职坐标数据库Oracle数据库频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 2 不喜欢 | 0
看完这篇文章有何感觉?已经有2人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程