ORACLE-ROWNUM及分页(总结)

1 篇文章 0 订阅
1 篇文章 0 订阅

1.ROWNUM的理解

对于 Oracle rownum问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<<=!=),并非说用>,>=,=,between..and时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum伪列的意义就不应该感到惊奇,同样是伪列,rownum rowid可有些不一样,下面以例子说明。

1select t.*,rownumfrom base_student t whererownum<20SQL当然是没有任何问题的。但,这里得注意此处查询出来的结果是按照数据库记录插入顺序给排序出的20条记录。

img1

2select t.*,rownumfrom base_student t whererownum >20SQL就有问题了。在此我说下rownumrownum是从数据库中(当然根据你的查询条件)取出记录后根据插入数据顺序从1开始顺序递增。而当取出第一条数据的时候rownum1,条件>20不满足,则不取出,如此循环,再次取出又rownum1,判断不满足,所以得不到数据。

img2

3select t.*,rownumfrom base_student t whererownum >0或者

   select t.*,rownumfrom base_student twhererownum >=1当然这也是可行的。因为此SQL满足上面2)的规则rownum1开始。

img3

4select t.*,rownumfrom base_student t whererownumbetween10and20这句SQL是不行的,根据2)rownum规则不满足。

   select t.*,rownumfrom base_student twhererownumbetween1and10这句SQL可行,查询出根据数据插入数据顺序前10条数据。

img4

2.ROWNUM的运用分页

首先贴出根据rownum分页的标准版SQL,再进行分析。

select * from(select t.*,rownum rn from(select *from base_studentorderbynodesc) twhererownum<10000)where rn>9980;

分析:

img5

1)图中1区域SQL:select *from base_studentorderbynodesc此为你所需要查询数据SQL语句。

2)图中2区域SQL:select t.*,rownum rn from (

                      select *from base_studentorderbynodesc

                      )t

              whererownum <10000

根据你的查询SQL查出rumnum<10000的数据。

Ø  在此你是否想问,为什么不直接用:

select t.* from base_student twhererownum <10000

在此我明确的告诉你,用此SQL不是不行,是可行的。但是这句SQL是根据数据库记录插入顺序查出记录自动编号1-10000。理想是美好的,但是现实是残酷的。我们现实使用的时候通常有自己的排序顺序。

Ø  在此你是否还想问,可以不可以用:

select *from (

    select t.*,rownumas rownum_from base_student torderbyno

) where rownum_<10000

在此再次强调下rownum的含义,内部嵌套select t.*,rownumas rownum_ from base_student torderbyno中的rownum生成顺序:先根据数据库数据插入顺序查询出数据生成rownum,后才order by操作,所以你会发现你想要的排序顺序分页,数据并不合你意,就是因为顺序问题。

Ø  而图中2区域SQL,可以理解为:先根据内部嵌套SQL的排序顺序生成临时的一个表,而此表格的数据顺序正是你所需要的,在此用rownum<10000就行了。

Ø  在此我也曾由此疑问:

select t.*,rownum rnfrom (

     select *from base_studentorderbynodesc

 ) t whererownumbetween9980and10000

在此我根据rownum定义(上面ROWNUM的理解2)可查看)得知,rownum是从1开始查询编号的,所以这条SQL根本不能查出数据。

3)所以我们引出了第三次嵌套,用第二层嵌套的rownum作为此嵌套插叙数据的一个字段,在第三次的时候筛选。

3.其他分页方法

1ROWID

img6

执行时间 0.094s

2ROWNUM

img7

执行时间 0.202s

3)分析函数row_number()

img8

执行时间 0.249s

总结:

ROWID最快,因为rowid为表中唯一记录,在内部嵌套查询只查询它,所以效率最高。但是通用性不强。

ROWNUM速度次之,因为嵌套查询数据。但是只要传入自身所需SQL就可以实现分页。

分析函数ROW_NUMBER()最差,虽然分析函数很好用(个人也经常用),但是效率真的不敢恭维。(此处执行和rownum相差不大,但是实际多实践证明相差非常大)

4.结语

That’s all.在此声明,此为个人理解,若发现问题,忘指出共同探讨。共同进步。

@ORACLE

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值