Oracle中rownum、rowid、row_number()、rank()、dense_rank()的区别

一.rownum关键字:通常在sql分页时或在查询某一范围的记录时,会使用rownum。

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

2.rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以sql不同,最终也会导致rownum不同。

3.rownum是根据sql查询后得到的结果自动加上去的,但是他却不受到sql中order by排序的影响,因为它和rowid的顺序一样是系统按照记录插入时的顺序给记录排的号(顺序的、无跳跃),例如:

select rownum as rn, t.* from emp t;

 

但是如果你想让rownum和order by一样的顺序 那么可以使用子查询,形如:select rownum,t.* from (select * from 表空间名 order by 字段名) t 这样的话rownum就是根据该字段进行排序的编号了,等同于row_number() over(order by 需要排序的字段名)。

例如:查询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名。

rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)。

 

五、DENSE_RANK()函数

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

dense_rank()是连续排序,有两个第二名时仍然跟着第三名。他和row_number的区别在于row_number是没有重复值的。

posted @ 2020-09-13 12:28  nbako555  阅读(335)  评论(0编辑  收藏  举报