oracle中rownum、rowid、row_number()、rank()、dense_rank()的用法

一.rownum函数

rownum是一个伪列,是对查询出的数据自动添加的一个行号。

rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以你的sql不同,最终也会导致rownum不同。我们通常在sql分页时或在查询某一范围的记录时,我们会使用rownum

例如:查询10条数据

select rownum,t.*
  from dm_custbd_index_month t
 where t.index_id = 'CUSIND_FUL001'
   and t.c_month = '201601'
   and rownum<=10;

或者

select rownum,t.*
  from dm_custbd_index_month t
 where t.index_id = 'CUSIND_FUL001'
   and t.c_month = '201601'
   and rownum between 1 and 10;

结果都是:


如果把条件改为>10。就会出现问题。因为 rownum是对结果集加的一个伪列,即先查到一个结果集之后再加上去的一个列。它总是从1开始,所以选出的结果集不可能没有1而有其它大于1的序列号


如果要用rownum来查某一范围内的记录。可以这样

select *
  from (select rownum rn, t.*
          from dm_custbd_index_month t
         where t.index_id = 'CUSIND_FUL001'
           and t.c_month = '201601') t1
 where t1.rn between 5 and 10;



二、ROWID函数

rowid同rownum一样,是一个伪列,并不实际存在于表中。

在每条记录insert到数据库中时,都会有一个唯一的物理记录,这个记录是不会随着sql的改变而改变。

它是oracle在读取表中数据行时,根据每一行数据的物理地址信息编码而成的一个伪列。

rowid主要用来删除重复数据:

例如:表中有19条数据


去重之后有14条数据


取这14条数据:


删除重复的5条数据:

 delete from linshi_ljq t
  where rowid not in (select rw from (select t.empno, t.ename, t.job,
   t.mgr, t.hiredate, t.sal, t.comm, t.deptno,max(rowid) as rw
  from linshi_ljq t
  group by t.empno, t.ename, t.job, t.mgr, t.hiredate, t.sal, t.comm, t.deptno))

三、ROW_NUMBER()函数

row_number()函数返回一个唯一的值,当遇到相同的数值时,排名按照记录集中记录的顺序依次递增。

row_Number()函数和rownum差不多,排名都是依次递增。只是row_number()一定要用over而rownum不能用over。

例如:

select t.*,t.sal, row_number() over(partition by t.deptno order by t.sal)
  from linshi_ljq t



四、RANK()函数

rank()函数作为一个排名函数。当遇到相同的数值时,所有的相同的数据的排名都是一样的。但是会在最后一条相同记录和下一条不同记录的排名之间空出排名。即有两个并列第1名接下来就会跳过第2名,直接是第3名。

例如:


五、DENSE_RANK()函数

dense_rank()是一个排名函数。当遇到相同的数据时,所有的相同的数据的排名是一样的。但是dense_rank()是连续排序函数,即有两个并列第一名任然会有第二名。

例如:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值