oracle中rownum、rowid、row_number()、rank()、dense_rank()的用法
2017-04-20 14:51
399 查看
一.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()是连续排序函数,即有两个并列第一名任然会有第二名。
例如:
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()是连续排序函数,即有两个并列第一名任然会有第二名。
例如:
相关文章推荐
- Oracle中rownum、rowid、row_number()、rank()、dense_rank()的区别
- Oracle中rownum、rowid、row_number()、rank()、dense_rank()的区别
- Oracle中rownum、rowid、row_number()、rank()、dense_rank()的区别
- oracle的“over partition by”的用法,over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用。
- Oracle rownum / row_number / rank / dense_rank 這四個的差異
- 排名函数(ROW_NUMBER、RANK、DENSE_RANK)及OVER子句 Oracle 中分析函数用法之--rank(),dense_rank(),partition,over()
- Oracle分析函数 — rank, dense_rank, row_number用法
- Oracle分析函数RANK(),DENSE_RANK(),ROW_NUMBER()的用法
- ORACLE排序:ROW_NUMBER、RANK、DENSE_RANK的用法
- Oracle开发专题之:分析函数2(Rank, Dense_rank, row_number) 【转】
- Oracle分级排序函数Rank、Dense_Rank、Row_Number比较
- SQL2005中row_number( )、rank( )、dense_rank( )、ntile( )函数的用法(2)(转)
- 如何使用Oracle的分析函数ROW_NUMBER、DENSE_RANK、RANK
- SQL2005中row_number( )、rank( )、dense_rank( )、ntile( )函数的用法
- Oracle开发专题之:分析函数2(Rank, Dense_rank, row_number)
- ROW_NUMBER、RANK、DENSE_RANK的用法(1)
- SQL2005中row_number( )、rank( )、dense_rank( )、ntile( )函数的用法(2)
- 【转】ROW_NUMBER、RANK、DENSE_RANK的用法
- ROW_NUMBER、RANK、DENSE_RANK的用法
- ROW_NUMBER、RANK、DENSE_RANK的用法(1)(转)