首页> 数据库> Oracle> 正文

oracle分页查询原理是什么

WBOY
发布: 2022-01-25 16:59:31
原创
5120 人浏览过

oracle的分页查询原理:1、利用ORACLE的rownum字段的特性查询;2、查询指定数量N条数据;3、从指定数量N条查询结果中,取出M条数据;4、在web开发中将M、N作为参数进行传递,就可以得到分页的结果。

oracle分页查询原理是什么

本教程操作环境:Windows10系统、Oracle 11g版、Dell G3电脑。

oracle分页查询原理是什么

分页的原理:

1.借助ORACLE的rownum这个字段的特性查询。

2. 查询前N条数据

3.从第2步的查询结果中取M到N条数据

4.在web开发中将M,N作为参数进行传递,就可以得到分页的结果。

例子: 查询表中20~30条记录,sql语句如下。

select * from( select rownum as pageNo, A.* from tableName A where rownum <= 30) B where B.pageNo >=20;
登录后复制

示例:

--如何获取雇员表中薪水最高的前5人?

SELECT * FROM( SELECT * FROM emp ORDER BY sal DESC) WHERE Rownum<6
登录后复制

--如何获取雇员表中薪水排名第5的雇员信息

SELECT * FROM( SELECT * FROM emp ORDER BY sal DESC) WHERE Rownum=5
登录后复制

--结果查询不出内容

--同样ROWNUM>=5查询5名之后的成绩也失败

--这里就涉及到ROWNUM只能小于不能大于等于。所以--oracle数据库分页查询的一个重要障碍就是这个。

--至于原理因为ROWNUM是一个每一次都要从1开始排列的伪列。于是ROWNUM>=n。比如1大于任何n(第几条)都不成立。倒是可以ROWNUM=1.可以查到。因为1>=1成立。N=2,1>=2就不成立了。所以大于等于只能查第一条。加上小于等于。只能查这些了。所以这个困难算是增加了分页查询的难度与障碍。

--方法一 最简单的查询

--第五条到第十条。

--只有一层嵌套,一个子查询,

SELECT * FROM (SELECT ROWNUM rn ,e.* FROM emp e WHERE ROWNUM<=10) WHERE rn>=5;
登录后复制

--这样其实就是下面的方法转化而来。

--也就是子查询得到的新表再次被查询。

--关键的一步就是ROWNUM rn。

--而且不要忘了e.*,不然没有完整数据。

SELECT * FROM (SELECT ROWNUM rn, e.* FROM emp e WHERE ROWNUM <= 10) table_1 WHERE table_1.rn>= 5;
登录后复制

--上面的没有排序,下面进行排序

--因为要先排序,才能查询,所以表越大,效率越慢。

--方法二

SELECT * FROM (SELECT ROWNUM rm ,e.* FROM emp e order by sal DESC ) WHERE rm>=5 AND rm<=10
登录后复制

--下面是用分析函数的方法;

--方法三

SELECT * FROM (SELECT emp.*, ROW_NUMBER () OVER (ORDER BY sal DESC) rank FROM emp) WHERE rank >=6 AND rank<=10;
登录后复制

--可是我们实际查询看一下结果,发现完全不一样。

--人工查看了一下。分析函数的方法结果是正确的。不理解。

--有没有谁能解释一下。

--下面来一个没有意义的

SELECT * FROM (SELECT e.*, ROWNUM AS rn from ( SELECT * FROM emp ORDER BY sal DESC) e )ee WHERE ee.rn>=5 AND ee.rn<=10
登录后复制

--方法四(海量数据查询,如百度,天猫查询)

SELECT * FROM( SELECT e.* ,ROWNUM rn FROM ( SELECT * FROM emp ORDER BY sal DESC ) e WHERE ROWNUM<=10 )WHERE rn>=6;
登录后复制

--分解步骤

--第一步:

SELECT * FROM emp ORDER BY sal DESC
登录后复制

--第二步:

SELECT e .*,ROWNUM rn FROM (SELECT * FROM emp ORDER BY sal DESC) e
登录后复制

--第三步:

SELECT e .*,ROWNUM rn FROM (SELECT * FROM emp ORDER BY sal DESC) e WHERE ROWNUM<=10
登录后复制

--第四步:

SELECT * FROM( SELECT e .*,ROWNUM rn FROM (SELECT * FROM emp ORDER BY sal DESC) e WHERE ROWNUM<=10) WHERE rn>=5
登录后复制

--猜测错误。

SELECT e .*,ROWNUM rn FROM (SELECT * FROM emp ORDER BY sal DESC) e WHERE rn<=10
登录后复制

--起别名必须查询出数据表才行,

--而查询条件用还不存在的条件去判断,自然失败。

--方法五,闲的无聊的用法

WITH ee AS ( SELECT e.*, ROWNUM rn FROM ( SELECT * FROM emp ORDER BY sal DESC )e ) SELECT ee.* FROM ee WHERE ee.rn>=5 AND ee.rn<=10
登录后复制

推荐教程:《Oracle视频教程

以上是oracle分页查询原理是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!