在Oracle中有一个方法rownum用来查询第一行到第n行的内容,但没有一个合适的方法若查询第x行到第y行的内容,而在实际应用中却经常需要查询第x行到第y行的内容,这时我们就需要使用rownum和子表查询等内容来进行查询,因为这一块内容属于Oracle总的常用部分所以专门在此介绍。
rownum
在Oralce中有一个伪列rownum,其在创建表的时候就存在了却不显示,若要使用这个列可以直接调用即可,也可以对这个列添加别名来调用。
rownum只能用于显示小于某行的数据即第一行开始到你要查询到的那一行为止的数据。
rownum对于小于某值的查询条件
select * from emp where rownum<=3; 查询emp前三行记录
rownum对于等于某个值得查询条件
select * from emp where rownum=1; 显示第一行记录
分页
在Oracle把查询第几行到第几行的操作称为分页,其具体操作是通过子查询等操作完成。
select 列名 from (select 表名.*,rownum rn from 表名)表名 where rn操作;
思考如下:
1.选择所有内容
select * from emp;
2.显示rownum
select e.*,rownum rn from(select * from emp)e;
这一步可以精简为下面形式,但某些情况只能用上面那种
select emp.*,rownum rn from emp;
3.查询
select * from(select e.*,rownum rn from (select * from emp)e);
4.其他变化
select * from (select emp.*,rownum rn from emp)emp where rn=3;
查询第三行的信息
select * from(select e.*,rownum rn from (select * from emp)e where rownum<=10) where rn>2;
查询第三到第十行信息。上面的也可以精简为
select * from(select emp.*,rownum rn from emp) where rn>2 and rn<=10;
在某些时候我们需要先对表的内容进行排序,随后查询第x行到第y行的内容,这个时候有一个需要注意的点是rownum是在表产生的时候产生的伪列,所以使用排序会连着rownum的值进行排序,从而达不到想要的效果。
select rownum,sal from emp order by sal;
为了解决上述这个问题,我们需要使用子表查询即先排好序,再在新表之中显示rownum来规避这个问题。
select rownum,sal.* from (select sal from emp order by sal)sal;
考虑到排序的问题,所以在上方第二步的时候使用第一种方法即select e.*,rownum rn from(select * from emp)e;,在内表select * from emp中进行排序可以完成在乱序中找到第x行到第y行的效果。
select * from(select e.*,rownum rn from(select * from emp order by sal)e)where rn>=3 and rn<=8;
输出emp表薪资排名3到8的员工信息。
网友评论