收拾和学习了一下英特网高手关于rownum的帖子:

参照他事他说加以考查资料:
 

对此Oracle的rownum难点,超多资料都在说不帮助>,>=,=,between……and,只好用上述符号(<、&
lt;=、!=),并不是说用>,>=,=,between……and
时会提醒SQL语法错误,而是临时是查不出一条记下来,还有大概会现出就像是是无法相信的结果来,其实你假诺领悟好了这么些rownum伪列的意思就不该以为欢愉,相仿是伪列,rownum与rowid可有个别不相同样,下边以例子表达:

  就算有个别表t1(c1)有20条记下。

  就算用select rownum,c1 from t1 where rownum <
10,只假若用小于号,查出来的结果相当的轻巧地与经常掌握在概念上能落得一致,应该不会有任何疑问的。

   可假使用select rownum,c1 from t1 where rownum >
10(就算写下那样的查询语句,这个时候在你的脑子中应当是想获得表中前面10条记下),你就能够意识,显示出来的结果要让您大失所望了,恐怕你还恐怕会狐疑是不哪个人删
了一部分笔录,然后查看记录数,仍为20条啊?那难点是出在哪呢?

   先好好掌握rownum的意思吗。因为ROWNUM是对结果集加的二个伪列,即先查到结果集之后再加上去的一个列
(重申:先要有结果集)。总的来讲rownum是对相符条件结果的系列号。它连接从1起来排起的。所以你选出的结果相当小概未有1,而有别的大于1的值。所
以你不可能希望获取下边的结果集:

  11 aaaaaaaa

  12 bbbbbbb

  13 ccccccc……

  rownum >10
没有记录,因为第一条不满意去掉的话,第二条的ROWNUM又成了1,所以永恒未有满意条件的笔录。或许能够如此敞亮:

 
 ROWNUM是一个行列,是oracle数据库从数据文件或缓冲区中读取数据的一一。它赢得第一条记下则rownum值为1,第二条为2,依次类推。假如你用>,>=,=,between……and那几个原则,因为从缓冲区或数据文件中获取的第一条记下的rownum为1,则被剔除,接着取下
条,不过它的rownum依旧1,又被删去,依次类推,便未有了数额。

  有了以上从不一样方面构造建设起来的对rownum的概念,那我们得以来认知使用
rownum 的三种现像

   1. select rownum,c1 from t1 where rownum != 10
为什么是回到前9条数据吧?它与 select rownum,c1 from tablename 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 最早

  从上得以见见,任曾几何时候想把 rownum = 1
那条记下舍弃是难堪的,它在结果聚焦是不可贫乏的,少了rownum=1
就好像荒诞不经通常无法存在,所以你的 rownum 条件要含有到 1

  但万一正是想要用 rownum >
10这种法则的话话将要用嵌套语句,把rownum先生成,然后对他张开询问。

  select *

  from (selet rownum as rn,t1.* from a where ……)

  where rn >10

  平日代码中对结果集实行分页正是这么干的。

 
 别的:rowid与rownum虽都被叫做伪列,但它们的存在方式是不相近的,rowid能够说是大意存在的,表示记录在表空间中的唯一个人置ID,在
DB中独一。只要记下没被移动过,rowid是不改变的。rowid相对于表来讲又像表中的相符列,所以rowid为原则就不会有
rownum这么些情形时有爆发。

rownum和排序:
SQL> select rownum ,id,name from student order by name;
    ROWNUM ID     NAME


         3 200003 李三
         2 200002 王二
         1 200001 张一
         4 200004 赵四
可以见到,rownum并不是依据name列来扭转的序号。系统是服从记录插入时的逐个给记录排的号,rowid也是各类分配的。为了消除这么些主题素材,必需使用子查询
SQL> select rownum ,id,name from (select * from student order by
name);
    ROWNUM ID     NAME


         1 200003 李三
         2 200002 王二
         3 200001 张一
         4 200004 赵四
如此那般就成了按name排序,并且用rownum标出正确序号(由小到大)

相关文章