oracle中Rowid和Rownum的区别

rowid和rownum都是虚列,但含义完全不同。rowid是物理地址,用于定位oracle中具体数据的物理存储位置,而rownum则是sql的输出结果排序。通俗的讲:rowid是相对不变的,rownum会变化,尤其是使用order by的时候。
rowid:用于定位数据表中某条数据的位置,是唯一的、也不会改变

rownum:表示查询某条记录在整个结果集中的位置, 同一条记录查询条件不同对应的 rownum 是不同的而 rowid 是不会变的
rowid:
我们在处理一张表中重复记录时经常用到它,
sql server中去重:
Select * from stuinfo a where not exists(select 1 from stuinfo where stuName=a.stuName and ID<a.ID) 

有另一个想法,既然rowid是唯一的,那为什么不用它作为主键呢,还另外定义一个主键列呢?
原因一:(RowID可那随时改变)首先RowID也是伪列,但是他也是唯一的。
他每个值表示数据块的地址。主键是可以做,但是很容易生效,当你对数据进行移动,如导入和导出之类的操作,这个RowID也会随之改变。所以说RowID不适合做主键。
原因二(主键也就含有自动创建的唯一索引)索引创建的过程就是由RowID和列值进行绑定,
当数据块地址发生改变的时候,如删除一条记录,那么索引也会被自动维护,
也就是说RowID会自动改变,这也是ORACLE内部用ROWID的方法

rownum:
在Oracle中,要按特定条件查询前N条记录,用个rownum就搞定了。 select * from emp whererownum<= 5 而且书上也告诫,不能对rownum用">",这也就意味着,如果你想用 select * from emp whererownum> 5 则是失败的。要知道为什么会失败,则需要了解rownum背后的机制:
1.数据库执行查询
2.Oracle读取第一行并调用它排1号。
3.我们过去读的数据符合标准吗?如果不符合,那么Oracle弃行,如果符合,Oracle将返回这行。
4.Oracle读取下一行提出的行数(2,然后3,然后4,等等)。
5.回到第三步
了解了原理,就知道rownum>不会成功,因为在第三步的时候查询出的行已经被丢弃,第四步查出来的rownum仍然是1,这样永远也不会成功。

同样道理,rownum如果单独用=,也只有在rownum=1时才有用。
rownum可以用在分页查询上:
以下是代码:
  SELECT * FROM

  (

  SELECT A.*, ROWNUM RN

  FROM (SELECT * FROM 表名) A

  WHERE ROWNUM <= 40

  )

  WHERE RN >= 21

  其中最内层的查询SELECT * FROM 表名表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。

  上面给出的这个Oracle分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。

猜你喜欢

转载自kedamaomao.iteye.com/blog/2358933