Oracle之rownum不能使用大于>的问题

    今日在写sql测试突然发现rownum进行“>、>=、=、between...and”运算时语法不报错但查不出一条记录,而“<、<=、!=”运算却可以,起初以为sql写的有问题,反复确认后亦之,故网上瞄瞄,原谅我孤陋寡闻了...那就来学学这个问题吧。

一、rownum说明:
rowid 与 rownum 虽都被称为伪列,但它们的存在方式不一样的:
rowid 是物理存在的,表示记录在表空间中的唯一位置ID,在DB中是唯一的。只要记录没被搬动过,rowid是不变的。
rowid 相对于表来说又像表中的一般列,所以,以 rowid 为条件就不会有rownum那些莫名其妙的结果出现。
另外还要注意:rownum不能以任何基表的名称作为前缀。
如下SQL语句:

select s_id,s_c,rownum rn from temp_test where rownum>4;


没有查到任何记录!

       因为rownum总是从1开始的,第一条不满足去掉的话,第二条的rownum 又成了1。依此类推,所以永远没有满足条件的记录。
可以这样理解:rownum是一个序列,是Oracle数据库从数据文件或缓冲区中读取数据的顺序。
它取得第一条记录则rownum值为1,第二条为2。依次类推。
当使用“>、>=、=、between...and”这些条件时,从缓冲区或数据文件中得到的第一条记录的rownum为1,不符合sql语句的条件,会被删除,接着取下条。
下条的rownum还会是1,又被删除,依次类推,便没有了数据。

二、对rownum使用中几种现象的分析说明
(1) select rownum,id,age,name from loaddata where rownum != 10 为何是返回前9条数据呢?
为什么它与 select rownum,id,age,name from loaddata where rownum < 10 返回的结果集是一样的?
因为是在查询到结果集后,显示完第9条记录后,之后的记录都是 != 10或者 >=10,所以只显示前面9条记录。
也可以这样理解,rownum为9后,取的记录的rownum为10,因条件为 !=10,所以删掉。然后取下一条,其rownum又是10,也删掉。以此类推。
所以只会显示前面9条记录。

(2)什么rownum >1时查不到一条记录,而 rownum >0或rownum >=1 却总显示所有记录。
这是因为rownum是在查询到的结果集后,再加上去的,它总是从1开始的。

(3)为什么between 1 and 10 或者 between 0 and 10 能查到结果,而用 between 2 and 10 却得不到结果。
原因同上:因为 rownum总是从1开始。


内容来源与作者发布和网络,如有版权相关问题请及时与我们取得联系,我们将立即删除。

关于作者

落花飞雪 点击这里给我发消息

相关推荐

这些你应该也会喜欢

解决Flutter输入法遮挡页面问题

这个问题看网上有很多解决方法,发现几乎都是错误的,并且麻烦,这里有个简单的方法,借助bottom:MediaQuery.of(context).padding.bottom;这个bottom的值是系统...

2021-08-20 11:29:22 还如一梦中
Flutter给页面增加滚动SingleChildScrollView

使用SingleChildScrollView可以给页面增加滚动:late ScrollController _controller = ScrollController();SingleChildS...

2021-08-20 09:10:34 还如一梦中
2021Flutter发布package到Pub终极解决方案

整整折腾了1天半终于成功吧package上传到了pub上。先花了15在淘宝找人代注册了个google账户。先取消配置的环境变量FLUTTER_STORAGE_BASE_URL https://stor...

2021-05-27 11:49:52 还如一梦中
SpringBoot一梦支付系统搭建完全教程

懂Java Spring Boot的朋友可以选择性的参考被教程,小白就完全按步骤来吧!首先Linux系统安装宝塔,这个省略然后安装Java环境,有2种方式:第一种下载java8 sdk 然后设置Lin...

2021-07-13 19:18:28 还如一梦中
Oracle之分区数据删除

---查看分区的名字SELECT a.table_name,a.partition_name FROM user_tab_partitions  a WHERE a.table_name = 'TES...

2021-07-14 16:34:52 落花飞雪
Oracle之row_number() over()函数

      row_number() over()函数,用于给数据库表中的记录进行标号,在使用的时候,其后还跟着一个函数 over(),而函数 over() 的作用是将表中的记录进行分组和排序即:RO...

2021-07-14 16:31:02 落花飞雪
Oracle之rownum不能使用大于>的问题

    今日在写sql测试突然发现rownum进行“、=、=、between...and”运算时语法不报错但查不出一条记录,而“、=、!=”运算却可以,起初以为sql写的有问题,反复确认后亦之,故网上...

2021-07-01 13:44:30 落花飞雪
Oracle之Top写法

由于Oracle不支持select top 语句,所以在Oracle中经常是用order by 跟rownum的组合来实现select top n的查询。实现方法如下所示:select 列名1 ......

2021-07-01 11:36:01 落花飞雪
StatefulBuilder实现Dialog的刷新

在Flutter中使用Dialog时,因为showDialog返回的context与当前页面的context不是同一个,所以通过setState是无法刷新Dialog里面的页面的。这时我们就可以用St...

2021-06-21 17:08:14 还如一梦中
Flutter 输入控件TextField设置内容并保持光标在末尾

///默认的Controller if (widget.controller == null) { defaultController = TextEditingController.from...

2021-06-28 17:59:23 还如一梦中
在线客服