您的位置:首页 > 数据库 > Oracle

Oracle的rownum用法

2016-11-06 23:34 1031 查看
   rownum来说它是oracle系统顺序分配为从查询(结果集)返回的行的编号(强调:先要有结果集),返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。

1、(1)查找前n条数据

select * from student where rownum <= n
  (2)查询大于第n条记录(n>1)

 如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录。  
  但是,可使用以下的子查询方法来解决。子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。 

select * from(select rownum rowno,id,name,age from student) <span style="font-family: Arial, Helvetica, sans-serif;">where rowno>n</span>

2、rownum和order by

(1)对非主键字段进行排序

select * from student where rownum<10 order by name  --name为非主键字段


  却发现oracle却不能按自己的意愿来执行,而是先随便取10条记录,然后再order by。

  如果需要对非主键字段排序再取前n条数据,只能用子查询来实现先排序,后rownum,可以用下方式实现:

select * from (select * from tabname order by name) where rownum<10


  但这样一来,效率会低很多。

出现这种原因是:Oracle先按物理存储位置(rowid)顺序取出满足rownum条件的记录,即物理位置上的前5条数据,然后在对这些数据按照order By的字段进行排序,而不是我们所期望的先排序、再取特定记录数。
(2)对主键字段进行排序
  在使用rownum时,只有当order By的字段是主键时,查询结果才会先排序再计算rownum。

select * from student where rownum<10 order by name   --name为主键


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle