Oracle数据库rownum和row_number的不同点

 更新时间:2015年11月10日 10:25:15   投稿:mrr  
在Oracle中,有一个很有趣的东西,那就是rownum。当你从某个表中查询数据的时候,返回的结果集中都会带有rownum这个字段,而且有时候也可以使用rownum进行一些条件查询

明确对于rownum 来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是二,以此类推,这个为字段可以用于限制查询的返回的总行数,因为rownum总是从1开始,但是1以上的自然数在rownum 做等于判断时都认为是false 条件,所以无法查到 rownum=n (n》1的自然数),所以查找第二行以后的记录可以用子查询方法来解决,给子查询中的rownum取别名;对于小于某个值的情况两种方法都差不多,但是对于某个不等于一的值或者求某个值到某个值之间的情况,用row_number() 别名获得排名 ,比用rownum伪列要简单方便的多;因为伪列总是从一开始查找;

具体用法和区别参见以下代码; 

--取出工资最高的前5位

select empno,ename,sal,rownum from emp; 
select * from (select * from emp order by sal desc) where rownum<=5; 
select * from (select ename,sal,row_number() over(order by sal desc) as num from emp) where num<=5; 
select * from (select ename,sal,row_number() over(order by sal desc) from emp) where rownum<=5 

--工资的前3名

select * from emp where sal >=any(select * from (select sal from emp order by sal desc) where rownum<=3); 
select * from(select * from emp order by sal desc) where rownum <4; 
select * from (select ename,sal,empno,deptno ,row_number() over (order by sal desc) from emp) where rownum<4; 
select * from (select ename,sal,empno,deptno ,row_number() over (order by sal desc) as num from emp) where num<4 

--按照工资排序,取出第6名到第10名

--使用伪列获得

select * from (select ename,sal,rownum r from (select * from emp order by sal desc) where rownum<=10) where r>5; 

--使用排名函数获得

select * from (select ename,sal,row_number() over(order by sal desc) as num from emp) where num>5 and num<=10; 

------- 按工资从高到低获得工资排名第四的员工

select * from (select ename,sal,row_number() over(order by sal desc) as num from emp) where num=4; 
select * from (select ename,sal,rownum r from (select * from emp order by sal desc) where rownum<=4) where r=4;

总结oracle中rownum和row_number()的区别

row_number()是分析函数,基本语法为row_number() over(partition by 字段 order by 字段)

rownum是一个伪列

select * from dept  where rownum<=3; 
select * from dept  where rownum between 2 and 3;这儿会出错,因为rownum的特性(没有1就不会有2,没有3)决定的
SELECT * FROM (SELECT A.*,ROWNUN FROM DEPT A)T1 WHERE T1.ROWNUM BETWEEN 2 AND 3;这么写不对,要这样写
SELECT * FROM (SELECT A.*,ROWNUM RN FROM DEPT A)T1 WHERE T1.RN BETWEEN 2 AND 3;

他们的主要区别是:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而函数row_number()在包含排序从句后是先排序再计算行号码。

相关文章

  • CentOS7下Oracle19c rpm安装过程

    CentOS7下Oracle19c rpm安装过程

    这篇文章主要介绍了CentOS7下Oracle19c rpm安装过程,包含环境配置、依赖安装问题,对Oracle19c rpm安装相关知识感兴趣的朋友一起看看吧
    2021-07-07
  • EBS xml publisher中文乱码问题及解决办法

    EBS xml publisher中文乱码问题及解决办法

    这篇文章主要介绍了EBS xml publisher中文乱码问题及解决办法的相关资料,需要的朋友可以参考下
    2015-09-09
  • Oracle12c图形化&静默安装踩坑的方法步骤

    Oracle12c图形化&静默安装踩坑的方法步骤

    这篇文章主要介绍了Oracle12c图形化&静默安装踩坑的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • ORACLE如何批量插入(Insert)

    ORACLE如何批量插入(Insert)

    这篇文章主要介绍了ORACLE如何批量插入(Insert),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • LINUX下Oracle数据导入导出的方法详解

    LINUX下Oracle数据导入导出的方法详解

    这篇文章主要介绍了LINUX下Oracle数据导入导出的方法,较为详细的分析导出工具exp及导入工具imp的具体使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-12-12
  • oracle ORA-01114、ORA-27067错误解决方法

    oracle ORA-01114、ORA-27067错误解决方法

    本文章总结了关于ORA-01114、ORA-27067错误解决方法,有需要学习的朋友可参考一下下哦
    2012-10-10
  • Oracle数据库中通用的函数实例详解

    Oracle数据库中通用的函数实例详解

    OracleSQL提供了用于执行特定操作的专用函数,这些函数大大增强了SQL语言的功能,下面这篇文章主要给大家介绍了关于Oracle数据库中通用函数的相关资料,需要的朋友可以参考下
    2022-03-03
  • oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert

    oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert

    最近接了一个项目,其中项目需求,有一个非常纠结的问题,由于业务的关系,DB的数据表无法确定,在使用过程中字段可能会增加,这样在insert时给我造成了很大的困扰。接下来,通过本篇文章给大家介绍oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
    2015-11-11
  • Oracle数据库表中字段顺序的修改方法

    Oracle数据库表中字段顺序的修改方法

    这篇文章主要给大家介绍了关于Oracle数据库表中字段顺序的修改方法,在介绍修改的方法之前先给大家介绍了Oracle数据库表新建字段的方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • Windows server 2008 R2(win7)登陆sqlplus错误ORA-12560和ORA-12557的解决方法

    Windows server 2008 R2(win7)登陆sqlplus错误ORA-12560和ORA-12557的解

    这篇文章主要为大家详细介绍了Windows server 2008 R2(win7)登陆sqlplus错误ORA-12560和ORA-12557的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05

最新评论