个人对Oracle分页查询中的rownum伪列的理解

个人对Oracle分页查询中的rownum伪列的理解

说明:仅仅是个人理解,有不对之处望指正!!!

恰好在学习oracle中遇到伪列rownum进行分页查询,一开始也是似懂非懂,迷迷糊糊的。后来自己结合一些博主的想法以及自己的理解总算是有点彻悟。

先来段伪官方点说法(实际上,懂得都得哈):

rownum是在获得一个结果集后用来标记这个结果集的字段,我们称这个结果集为“伪列”,顾名思义解释虚的,不是事实存在的列。注意!注意!是获得一个结果集后才会有这个伪列。比如说: select t.a, t.b from t; 这就是查询表t得到符合条件的结果集,得到这个结果集才会产生伪列。符合条件的结果集(指非空的结果集),它的rownum是从1开始算起的,不存在架空于1之上的值,就是说不存在数量的起始是非1的值,数数也必须从1开始数起对吧,这样说好理解吧。

我们来看两段代码(我直接上图):

表emp是oracle学习资料用户scott中自带的表,我们先查询整表,一共有12行数据;

查看伪列生成:红色框就是rownum数据

继续利用伪列进行条件查询:很明显发现加入rownum<6的条件语句后对比上图后前5条数据便打印出来

继续利用伪列进行条件查询:很奇怪是不是什么都没有输出(别着急等会给你慢慢分析);留着!!!我们想的是后面7条数据应该打印出来,然而并没有。

继续利用between 1 and  5进行查询:这里同样能打印前5条数据(也可以试试between 0 and 5,结果一样,这里就不试啦嘻嘻)

继续试试 between 2 and 6 进行查询:同样没有结果!!!

 

现在针对上述情况进行分析:

回到我们强调的那句话,分两点,一是伪列产生在结果集后;二是rownum必须从1开始。再来点官方点的说法:rownum是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。

  • rownum < 6 的条件下,当取第一个数据时,rownum = 1是小于6的,满足条件,取第二个数据 rownum = 2,满足条件,依次类推,直至超出条件。
  • 如果rownum > 2甚至说rownum>1来说,读取数据时第一条数据rownum = 1,与条件相比,不符合查询条件,执行下条数据,同样不满足,则会给删除直至最后全部删除。最后就像我们看到的结果一样是什么都没有查询出来。
  • 同样的between A and B 是同样的道理,>=A 和 <= B,若A的值大于1,>= 大于1的肯定是rownum > 1,同样一条记录都查询不到。那么若想查到数据的话,A的值可以为0和1。
  • 我们再看看 rownum > 0的情况,不妨试试,可以发现会把所有的数据全部打印出来,因为rownum 是从1开始的,rownum的值永远是>0的,所以所有都满足结果。
  • 那还有 != 的情况,记住 “伪列产生在结果集后”,“rownum必须从1开始”,我们同样可以按照上面那样理解,比如说 rownum != 6,当rownum = 5时,前5条数据都会给打印出来,往后的rownum都不满足条件,可以理解为rownum =6 时不满足条件, 删除,但此时 rownum 始终是5,后面的数据都不满足,都被删除,rownum 应该是+1-1+1-1状态。

那我们是不是没办法用rownum > 1 这样的条件啦?当然不是,主要应用于分页查询,就表emp来说,12条数据,我们来个中间分页吧。

每页4条数据,我们来查看第二页的数据,仔细想想为什么1要取别名, 2不能用rn,3只能用别名?我个人的理解:2中的rownum是嵌套子查询语句中的伪列查询条件,根据结果读取顺序来做判断;1中的rownum是对查询结果进行伪列的实际字段展示;取别名目的是给分页查询的主查询语句调用,若不取别名,同样用rownum > 4,会作为主查询语句的伪列来使用,同样会查不到任何结果,所以取别名很关键,是rn是子查询语句结果集的一个新的字段。

以上就是个人对rownum伪列的全部理解,不正确之处望指出!!!!!!

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值