oracle数据库rownum讲解,

使用的是Oracle 提供的scott用户中的表,

–找到员工表中工资最高的前三名

在mysql 里面可以使用limit很轻易的完成,但是oracle 中没有limit关键字,所以分页查询会比较麻烦,所以我们需要使用oracle 提供的rownum, 伪列 ,表中是没有的,是oracle 自带的,

这里写图片描述

然后根据以上的逻辑,我们使用伪劣进行判断,
这里写图片描述
那你如果你以为只要再排序一下,就可以的话,那么你就错了 .
这里写图片描述
从上图可以看到,排序后的顺序被打断了,

我们来看看oracle的执行顺序

from .. where ... group by .. having .. select ..rownum.. order by
rownum 是在order by 之前执行的,也就意味着它是先算好行才排序,针对这类问题的解决手法通常是  想办法让order by在 rownum之前执行,那么问题来了,怎么让order by 先执行呢?  答案是, 使用子查询,把子查询放在from 后面,那么就会第一个查询,好了,看代码

select 
  rownum,e.*  //最后执行
    from (select * from emp order by sal desc) e;  //该行优先执行

这里写图片描述
通过上图我们可以发现,我们的思路是正确的,那么我们就顺水推舟,一口气写完
这里写图片描述

答案正确,证明我们的思路是没问题的,

那么我们改需求,查询5 - 10 条数据

这里写图片描述

为什么呢?
看我们下面的分析 ,
这里写图片描述
如果没有输出数据,rownum是不会增加的,所以条件永远不会满足,针对于这种方法,解决方案是 使用子查询先查询 10条数据,然后再取5-10行,


--先查询10行的数据
select rownum, e.*
  from (select * from emp order by sal desc) e
 where rownum < 10;
--然后把这十行当成一个表,在表里面拿5-10行的数据 
select m2.*
  from (select rownum line, e.*
          from (select * from emp order by sal desc) e
         where rownum <= 10) m2
 where line > 5
   and line <= 10;

需要注意的是,如果rownum没有重命名的话,会报错的,应该是键重合了,

查询结果如下
这里写图片描述

结论:

  ruwnum 查询的时候只能使用<  <= 等符号,不能使用 > 的符号,>= 很多情况下都不能使用,建议不要使用 >= 符号,
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值