学习SQL语句中有个经典的题目,比如查询薪水的前5名,我们可以使用排序之后rownum<=5来查询。

select * from (select * from emp order by sal desc) hh where rownum<=5;

注:rownum是隐藏列,此外rowid是64位进制的隐藏列,不存在于临时表中。

如果想要取中间5-10名的数据又该如何写SQL语句呢?由于乱序的rownum无法查询,所以取中间范围需要处理,分页检索。这里提供3种方法:

1.两个相减

select t1.*,rownum oua from (select t.*,rownum ina from emp t order by sal desc) t1
where rownum<=10
minus
select t2.*,rownum oua from (select tt.*,rownum ina from emp tt order by sal desc) t2
where rownum<=5;

2.在外面再嵌套,就能使用rownum>=了,此时是有序的。

select t1.*,rownum r1 from (select t2.*,rownum r2 from (select e.*,rownum r3 from emp e order by sal desc)t2)t1 
where r2>=6 and r2<=10;

3.法3:用offset 和 fetch 取

select t.*,rownum from emp t order by sal desc 
offset 0 row
fetch next 5 row only;

注:0是起始,next5是取多少条,即偏移量。

Related Posts