oracle 分页 rownum 和 order by

 

Oracle的分页是通过rownum实现的。

rownum是一个伪列,是oracle系统自动为查询返回结果的每行分配的编号,第一行为1,第二行为2,以此类推。。。。

一个oracle分页,至少要包含三层(除非不用order by,暂时可以用2层实现),模板为

select temp2.* from(

           select rownum num,temp1.* from(

                    SQL查询

           ) temp1 where rownum<=n1

)temp2   where temp2.num>n2

例如:值返回查询结果第11条到20条着10条的信息的SQL如下:

select temp2.*
from(
    select rownum num,temp1.*
      from(
        select tt.title_id,tt.name
              from t_title tt
        where tt.name like '%美%'
        order by tt.sort_seqs asc,tt.title_Id desc) temp1
    where rownum<=20
)temp2
where temp2.num>10

分析:

1.首先是一个正常的查询语句(包含order by)

select tt.title_id,tt.name
      from t_title tt
where tt.name like '%美%'
order by tt.sort_seqs asc,tt.title_Id desc

这个和正常的SQL语句没有任何的区别

2.添加rownum字段,显示列数(注意:rownum一定是先<n1,嵌套后再>n2)

select rownum num,temp1.*
from(
    select tt.title_id,tt.name
          from t_title tt
    where tt.name like '%美%'
    order by tt.sort_seqs asc,tt.title_Id desc) temp1
where rownum<=20

我们添加了rownum 显示字段,这时候就会会每行添加一个行数的编号;并且只返回20条之前的数据(包含20条)

3.截取第10条到20条的数据,SQL就是上面最完整的那个啦。

使用精解:

1.rownum的使用:

如下两条语句:

select rownum,id,name from student where rownum>2;

select rownum,id,name from student where rownum<=10;

第一条语句的执行结果为空,第二条语句的执行结果为前10条记录;

为什么会这样呢,我们知道rownum是伪列,是oracle为查询结果自动添加的伪列,第一行是1,如果where rownum>2,这时候查找第一条发现它的rownum=1,不满足条件,于是抛弃掉,把第二条语句的rownum赋值为1,再判断第二条记录是否满足条件,同样不满足。。。。于是发生了死循环一样的判断,最终返回空;

有人这时候就奇怪啦,为什么第一条记录rownum=1不满足条件时候,第二条记录rownum=2,却要重新设值为1呢-----非常简单,你直接在where后添加了条件rownum>2,它是个条件啦,第一条记录不满足条件,叫抛弃掉啦,这时候结果集是空的,当然会一直rownum=1的赋值;

解决办法:先查询,并为每条记录分配rownum,然后嵌套查询

select t.* from (select rownum num,id,name from student) t where t.num>2

第二条语句可以正常的执行,根据上面的解释,这个可以理解了吧!

2.rownum与order by同时存在的问题

当 where 后面有rownum的判断,并且存在order by时候,rownum的优先级高!

oracle会先执行rownum的判断,然后从结果中order by,很明显是错误的结果啦!就好像学校要取成绩最好的前10名同学,结果这种方法一执行,成了取出10名同学,然后按照成绩的高低排序!

这点与SQL Server的TOP完全不同,TOP遇上order by,是先执行order by,在分页的;

解决办法就是先执行order by,然后嵌套执行rownum-----说白啦就是用()改变函数的优先级!

----------------OK。明白了这两点,rownum就算理解啦!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值