您的位置:首页 > 数据库 > Oracle

[置顶] oracle数据库分页查询原理与事例实现(五六种方法)

2017-01-08 22:47 731 查看
如何获取雇员表中薪水最高的前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 <
4000
br>
( 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: