Oracle-伪列(rownum)

  1. 列出薪水水平处于第四位的员工。
    思路:要找到薪水处于第四位的员工,那么首先我们先要对薪水进行一个排序。
select * from emp order by sal desc

这里要找到排名第四的员工就需要借助rownum—>伪列
我们先看看伪列到底是什么

select rownum,emp.* from emp ; 

这里写图片描述
这里的rownum和前面的序号一摸一样
那么如果我们对薪水进行排序,再看看rownum会不会变呢

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

这里写图片描述
我们可以看到当我们对sal这一列进行排序之后,rownum也随之变化了,也就是说rownum是和对应的行绑定的。这里的绑定也就是和我们的emp的顺序是对应起来的。那么我们如何才能取出排名第四的员工呢。
那么我们就需要对已经排好序的这张表当作一张新的emp1,取他的伪列。

select rownum,emp1.* from  (select * from emp order by sal desc) emp1 ;

这里写图片描述
现在我们可以看到排名第四的员工对应的伪列号也是4了
其实我们现在可以总结一下,对于rownum来说,它的序列号就是对应的最原始的表,不包括排序之类的,所以如果我们需要排序之后的伪列号,那么我么就需要将排序之后的表当作一种新的表,把新的表当作原始的表。
那么接下要取出第四的员工,那么我将再将包括rownum的表当作一个新的表emp2,我们只需要一个where语句r=4就可以取出了

select  emp2.* from (
select rownum r ,emp1.* from  (select * from emp order by sal desc) emp1 ) emp2
where r=4;

`` `  
很奇怪的是这里必须要对rownum重命名,才可以,不知道为啥
那么我们总结一下:这里我们需要对emp进行两次重命名,第一次是在对薪水排序之后进行重命名,显示对应的伪列,然后第二次重命名是将有伪列的看成一张新的表emp2,取出排名第四的员工

1. 查找EMP表中前5条记录
我们要找到前5条记录只需要将where语句里面rownum<=5就行了
 select rownum, emp.* from emp where rownum<=5;
注意如果前面有rownum,那么这里的*前面就需要添加表名。
![这里写图片描述](https://img-blog.csdn.net/20170730213613296?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3FpdV9jcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)  

 1. 找EMP表中10条以后的记录。
 select emp1.* from(
 select rownum r,emp.* from emp) emp1
 where r >10;
![这里写图片描述](https://img-blog.csdn.net/20170730214159343?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3FpdV9jcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

 1. 查找EMP表中薪水第5高的员工。
  select emp2.* from(
  select rownum r,emp1.* from(
  select * from emp order by sal desc) emp1) emp2
      where r =5;
思路和前面的一样这里我就不再赘述了

 1. 查找EMP表部门30中薪水第3的员工。
  select emp2.* from (
  select rownum r,emp1.* from (
 select * from emp  where deptno=30 order by sal desc) emp1)     emp2
   where r =3 
![这里写图片描述](https://img-blog.csdn.net/20170730215243400?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3FpdV9jcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)   

 1. 查找EMP表中每部门薪水前3的员工。
 select emp2.* from(
 select rownum r,emp1.* from (
 select * from emp order by sal desc) emp1) emp2
 where r <=3;

“`
这里写图片描述
那么对于rownum的总结就到这里了,欢迎指教
这里写图片描述

posted @ 2017-07-30 21:30  crr121  阅读(247)  评论(0编辑  收藏  举报