为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Java Oracle
--oracle数据库分页查询原理与事例实现

--如何获取雇员表中薪水最高的前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
点击查看更多内容
6人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消