• Oracle数据库应用SQL语句进行分页,以及引申出来对rownum的理解


    分页的的方法从数据获取的角度上说,可以分为两种:
          其一,从数据库取出所有满足条件的数据,放入内存,然后在呈现的时候过滤,达到分页效果;
          其二,在SQL语句的写法上下文章,根据传入的页码、行数,只取出要显示部分的记录;
    我在项目中一般是用第二种方法,对于第一种方法的不足,数据量的增加会造成服务器内存消耗过大带宽不足等性能
    瓶颈。
    分页SQL语句的写法如下:
    SELECT * FROMSELECT rownum as rn,t.* from T WHERE rownum<50)WHERE rn >10   

    其中
    rownum的作用很关键,这里如果写成:
    SELECT * FROMSELECT rownum as rn,t.* from T WHERE rownum>10)WHERE rn <50   
    效果是一样的么?答案是:NO!这种写法只能得到空结果集,之所以会这样,就要从rownum的概念上来思考得出答案了。
       
          rownum是一个始终从1开始递增的伪列,是数据库从数据文件或缓冲区中读取数据的顺序


         它取的第一条记录的rownum值为1,接着为2,以此类推一直到指定的大小。如果直接取rownum大于10的记录,
    那么它的第一条记录(rownum为1)取出来后则会被删除,然后再取第二条,这时这条记录的rownum还是为1,这样
    下去,rownum始终都为1,永远无法达到10,所以第二条SQL语句无法取到任何结果集。所以,在SQL语句中,使用
    rownum>x(x>=1)这种写法是得不到数据的,如果x=0,也可以取得数据,但是这样没有什么意义的。

          以上,我们得出结论:想直接跨过rownum=1这条记录是完全不可能的!

          那么,要应用rownum实现分页数据的查询,就必须把rownum先生成,将其作为子查询进行搜索。即如第一种写
    法这样实现。

  • 相关阅读:
    变量定义和声明的差别(整理)
    堆栈指针理解
    HDU 4349 Xiao Ming&#39;s Hope
    iOS 8中CLLocationManager及MKMapView showUserLocation失败的解决的方法
    Ant命令行操作
    linux awk命令详细使用方法
    mysql 修改[取消]timestamp的自动更新
    cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第六步---炮台&amp;点击炮台加入英雄&amp;英雄升级
    SendMessage、PostMessage原理
    poj 2104 K-th Number 主席树+超级详细解释
  • 原文地址:https://www.cnblogs.com/stubman/p/1575199.html
Copyright © 2020-2023  润新知