• 用运oracel中的伪列rownum分页


    在实际应用中我们经常碰到这样的问题,比如一张表比较大,我们只要其中的查看其中的前几条数据,或者对分页处理数据。在这些情况下我们都需要用到rownum。因此我们要理解rownum的原理和使用方法。

    •     Oracle原理

        Oracle的rownum经常使用的符号有(<、<=、!=),其他比如(>,>=,=,between...and)oracle也能编译成功,但是结果却查不出一条记录来,

        假设某个表 student(sno,sname) 有 10 条记录

        如果用 select rownum ,sno from student where rownum < 5, 只要是用小于号,查出来的结果正确的。

        可如果用 select rownum ,sno from student where rownum > 5 。这条语句表面上的意思很好理解表中有10条数据,找rownum>5 的也就相当于找后面5条数据。可是结果确不想我们期待的那样出来后面的5条数据。

        先好好理解 rownum 的原来。因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。所以您没办法期望得到下面的结果集:

    11 sn11

    12 sn12

    13 sn13

    .................

        rownum>5 没有记录,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录。或者可以这样理解:

        ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。

    有了以上从不同方面建立起来的对 rownum 的概念,那我们可以来认识使用 rownum 的几种现像

    1. select rownum,sno from student whererownum != 10 为何是返回前9条数据呢?它与 selectrownum,c1 from tablename where rownum < 10 返回的结果集是一样的呢?

        因为是在查询到结果集后,显示完第 9 条记录后,之后的记录也都是 != 10,或者 >=10,所以只显示前面9条记录。也可以这样理解,rownum 为9后的记录的rownum为10,因条件为 !=10,所以去掉,其后记录补上,rownum又是10,也去掉,如果下去也就只会显示前面9条记录了

    2. 为什么 rownum>1 时查不到一条记录,而 rownum >0 或rownum >=1 却总显示所以的记录

    因为 rownum 是在查询到的结果集后加上去的,它总是从1开始

    • 分页处理

        但如果就是想要用 rownum > 5 这种条件的话话就要用嵌套语句,把 rownum 先生成,然后对他进行查询。

    select *

    from (selet rownum as rn,student.* from student where ...)

    where rn >5

        显示6-10条数据


    select * from (select rownum as rn,t.id, t.classname,t.genger,t.gender,t.college,t.score from t_student t where rownum <10 ) where rn >6

     或者

    select * from (select rownum as rn,t.id, t.classname,t.genger,t.gender,t.college,t.score from t_student t ) where rn between 6 and 10

    或者


    select * from (select rownum as rn,t.id, t.classname,t.genger,t.gender,t.college,t.score from t_student t ) where 6<rn and rn<10

  • 相关阅读:
    java 线程开启 中断
    手写迷你版hashmap
    基于状态机的乐观锁
    Python清空指定文件夹下所有文件的方法
    Python
    python+selenium配置Edge浏览器
    python+selenium怎么获取ul下面最后一个li或ul中有多少个li
    Python Selenium 笔记
    XPath定位时,使用文本的方法小技巧。
    python yield返回多个值
  • 原文地址:https://www.cnblogs.com/wangyonglong/p/5143679.html
Copyright © 2020-2023  润新知