ORACLE 中ROWNUM用法总结!
对于 Oracle 的 rownum 问题很多资料都说不支持>>==between……and只能用以上符号(<<=!=)并非说用> >==between……and 时会提示SQL语法错误而是经常是查不出一条记录来还会出现似乎是莫名其妙的结果来其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇同样是伪列rownum 与 rowid 可有些不一样下面以例子说明
假设某个表 t(c) 有 条记录
如果用 select rownumc from t where rownum < 只要是用小于号查出来的结果很容易地与一般理解在概念上能达成一致应该不会有任何疑问的
可如果用 select rownumc from t where rownum > (如果写下这样的查询语句这时候在您的头脑中应该是想得到表中后面条记录)你就会发现显示出来的结果要让您失望了也许您还会怀疑是不谁删了一些记录然后查看记录数仍然是 条啊?那问题是出在哪呢?
先好好理解 rownum 的意义吧因为ROWNUM是对结果集加的一个伪列即先查到结果集之后再加上去的一个列 (强调先要有结果集)简单的说 rownum 是对符合条件结果的序列号它总是从开始排起的所以你选出的结果不可能没有而有其他大于的值所以您没办法期望得到下面的结果集
aaaaaaaa
bbbbbbb
ccccccc
……
rownum > 没有记录因为第一条不满足去掉的话第二条的ROWNUM又成了所以永远没有满足条件的记录或者可以这样理解
ROWNUM是一个序列是oracle数据库从数据文件或缓沖区中读取数据的顺序它取得第一条记录则rownum值为第二条为依次类推如果你用>>==between……and这些条件因为从缓沖区或数据文件中得到的第一条记录的rownum为则被删除接着取下条可是它的rownum还是又被删除依次类推便没有了数据
有了以上从不同方面建立起来的对 rownum 的概念那我们可以来认识使用 rownum 的几种现像
select rownumc from t where rownum != 为何是返回前条数据呢?它与 select rownumc from tablename where rownum < 返回的结果集是一样的呢?
因为是在查询到结果集后显示完第 条记录后之后的记录也都是 != 或者 >=所以只显示前面条记录也可以这样理解rownum 为后的记录的 rownum为因条件为 !=所以去掉其后记录补上rownum又是也去掉如果下去也就只会显示前面条记录了
为什么 rownum > 时查不到一条记录而 rownum > 或 rownum >= 却总显示所以的记录
因为 rownum 是在查询到的结果集后加上去的它总是从开始
为什么 between and 或者 between and 能查到结果而用 between and 却得不到结果
原因同上一样因为 rownum 总是从 开始
从上可以看出任何时候想把 rownum = 这条记录抛弃是不对的它在结果集中是不可或缺的少了rownum= 就像空中楼阁一般不能存在所以你的 rownum 条件要包含到
但如果就是想要用 rownum > 这种条件的话话就要用嵌套语句把 rownum 先生成然后对他进行查询
select *
from (selet rownum as rnt* from a where ……)
where rn >
一般代码中对结果集进行分页就是这么干的
另外rowid 与 rownum 虽都被称为伪列但它们的存在方式是不一样的rowid 可以说是物理存在的表示记录在表空间中的唯一位置ID在DB中唯一只要记录没被搬动过rowid是不变的rowid 相对于表来说又像表中的一般列所以以 rowid 为条件就不会有 rownum那些情况发生
另外还要注意rownum不能以任何基表的名称作为前缀