oracle的rownum的学习(一)order by和rownum同时使用

(本文章内容仅在windows10下经测试能够运行,不能保证其他环境下的可靠性)

rownum使用时需要注意的三种情况和带来的问题:
1,必须从1开始,不能随机读取,, 带来的问题 不能使用形如rownum > n (n属于N+(正整数))的条件, 使用必须取别名,再使用嵌套查询并在外层查询语句的条件中使用该条件
2,不属于任何一张表, 不能使用带有形如e.rownum的语句

3,order by 和where语句中的rownum, 使用order by排序后需要再次使用嵌套查询才能使用排序后的rownum

 

案例一:查询emp表工资前三的员工信息

思路一:先按照工资倒序查询,再取rownum小于4的三条记录
结果:查询结果不正确
原因:查询语句执行顺序问题:先执行where语句,在执行order by 语句, 实际上查询出的是排序前的三条记录再按照工资倒倒序排列

查询语句如下:

select rownum,e.*
from emp e
where rownum <4
order by e.sal desc;

查询结果如下图所示:

 

 

工资倒序带行号查询emp所有员工信息代码如下:

select rownum,e.*
from emp e
order by e.sal desc;

查询结果如下图所示:

 

 

可以发现查询的结果是按照工资倒序排序前rownum<4的结果

这就是使用rownum需要注意的第三点带来的问题,需要解决

 

查询emp工资最高的三条记录
思路二:解决思路一出现的问题
解决思路,嵌套查询,将倒序查询的结果作为中间表再次按照行号取前三
查询结果:查询成功

查询代码如下:

select et1.*
from (
  select e.*
  from emp e
  order by e.sal desc
) et1
where rownum < 4;

查询结果如下图所示:

 

 比对按照工资倒序查询所有员工信息结果,确认查询成功

 

posted @ 2020-06-05 15:56  DNoSay  阅读(5879)  评论(0编辑  收藏  举报