玉祥平台客服-15087858732

标题: Oracle中的rownum使用中的一些问题简介 [打印本页]

作者: 张兴康    时间: 2020-6-26 13:46
标题: Oracle中的rownum使用中的一些问题简介
一、
为什么Oracle 的 rownum 不支持SQL语句中的“>、>=、=、between...and”运算符,只能用如下运算符号“<、<=、!=”
并非说用“>、>=、=、between..and”时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来。
其实,只要理解好了这个 rownum 伪列的意义就不应该感到惊奇。
例如:
select * from emp where rownum>2;
rownum>2,没有查询到任何记录。因为rownum总是从1开始的,第一条不满足去掉的话,第二条的rownum 又成了1。依此类推,所以永远没有满足条件的记录。
可以这样理解:rownum是一个序列,是Oracle数据库从数据文件或缓冲区中读取数据的顺序。
它取得第一条记录则rownum值为1,第二条为2。依次类推。
当使用“>、>=、=、between...and”这些条件时,从缓冲区或数据文件中得到的第一条记录的rownum为1,不符合sql语句的条件,会被删除,接着取下条。
下条的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条记录。

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

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

所以任何时候想把rownum = 1这条记录抛弃是不对的。它在结果集中是不可或缺的。


作者: 王爱东    时间: 2020-6-26 16:06
rownum,rowid很多地方都用处很大哈!
作者: 万望    时间: 2020-6-27 08:27
这么个道理
作者: 陈晓龙    时间: 2020-6-27 11:29
很详细的嘛!
作者: 张兴康    时间: 2020-6-27 13:05
陈晓龙 发表于 2016-1-27 11:29
很详细的嘛!

还行吧




欢迎光临 玉祥平台客服-15087858732 (http://bbs.delit.cn/) Powered by Discuz! X3.2