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;
查询结果如下图所示:
比对按照工资倒序查询所有员工信息结果,确认查询成功
路漫漫其修远兮,吾将上下而求索。