1. 概述

rownum是Oracle引入的虚列。 
在物理上这个虚列并不存在,只是在查询时才构造出来。伪列通常是自由分配的,用户无法执行修改等操作。

2. 特点

关于rownum有以下主要特点:

  • rownum不属于任何表。
  • rownum存在的前提,先有结果表。
  • rownum总是从1开始。
  • rownum一般只和<(<=)一起用。
  • 使用rownum进行分页查询需要把rownum转化为实列,并针对rownum查询。

3. 机制原理

rownum的用法看似奇怪,其实如果明白其机制原理就会很简单。 
首先我们来做个简单的实验:从dual表中取出所有的字段,并取出rownum。 
如果我们采用如下的写法:t.rownum

select t.*,t.rownum from dual t;

这样运行就会报01747错: 

因为实际上,dual表就不存在rownum这个字段,所以我们无法使用t.rownum的格式。 
正确的写法,应该是:

select t.*, rownum from dual t;

所以,rownum是一个虚列,不属于任何表。

那么这虚列是怎么来的。我们在做个简单的实验,便于理解: 
如下,我们有一个简单的表:test_ljb,共有十条记录。 
我们加上rownum。

select t.*, rownum from test_ljb t;

结果如下,很好理解,选出十条记录,rownum从1到10 
 
我们加上一个salary的筛选条件:

select t.*, rownum from test_ljb t where t.salary>1200;

结果如下:选出三条记录,rownum从1到3 
 
需要注意的是,第二个结果表的rownum对应的employee和第一张并不对应。 
如:在第一张表rownum为1时,对应的时Arvin,而第二张对应的是Oracle。

原因如下: 
因为rownum是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列。 
简单的说,rownum是对符合条件结果的序列号。它总是从1开始排起的,所以选出的结果不可能跳过1,而有其他大于1的值。 
或者说,rownum是一个动态的,根据新的结果集实时变化的。

比如,如下语句:

select t.*, rownum from test_ljb t where rownum >1; --大于2、3或者其他任何大于1的值,结果相同。

我们发现没有符合条件的记录。

根据原理,rownum是对结果集的从1开始排。那么以上的语句的结果集是什么呢?

事实上,当执行完from test_ljb时,我们可以把他当作时一个结果表,rownum是从1-10。 
然后,重点,当我们执行过滤条件,rownum>1 时,第一条记录不满足,剔除。这个时候,新的结果集产生了,原来的第二条记录就成了第一条,相应的rownum变为了1-9。 
再次比较原来的第一条,现在的第二条记录,他的rownum也是1,也不满足,rownum是1-8。 
以此类推,流水的记录,铁打的rownum从1开始。所以,直到rownum是1,还不满足。所以最后没有记录被筛选出来,也没了rownum。

所以,我们写出的这类语句:

rownum>1
rownum>5 and rownum<10
rownum between 6 and 9

统统都是没结果的。

不过有意思的是,选出前十条,可以有好多写法:

rownum<=10
rownum<11
rownum<>11  --不等于,根据原理应该很好理解,不赘述
rownum!=11  --不等于

4. 用法

那有的同学就犯嘀咕了,我要做大于查询怎么搞啊,分页查询怎么搞啊,人家Mysql和Hive一个limit a, b 直接完事,你Oracle怎么搞。 
其实方法还是有的,也是用rownum,不过要先把这货转化为实列。加个子查询就可以了。 
老套路,简单实验走一波

4.1 大于查询

还是test_ljb表,就选>5行。

select * from
(select t.*,rownum r from test_ljb t
)t
where t.r>5;

4.2  简单分页查询

select * from
(select t.*,rownum r from test_ljb t
)t
where t.r>3 and t.r<6

4.3  排序分页查询

排序分页查询就麻烦了,首先要排序,然后再排序的基础上再筛选。 
当然这个也是实际项目最常用的。 
选出薪水最高的第4、5、6个。

select rst.* from
(select t2.*,rownum r2 from (select t.*,rownum r1 from test_ljb t order by nvl(salary,0) desc--这里需要说明的是,rownum仅仅针对新的结果集动态标记,而排序并不会生成新的结果集。--所以这条语句的rownum看起来并不是按照1-10的顺序排列。--事实上,这里的rownum r1并不会用到,为了看起来更加直观,加上的。)t2
)rst
where rst.r2 between 4 and 6;

这里需要注意的是:rownum仅仅针对新的结果集动态标记,而排序并不会生成新的结果集,如果仅仅执行

select t.*,rownum r1 from test_ljb t order by nvl(salary,0) desc

结果如下: 

你听过Oracle中rownum用法吗?相关推荐

  1. ORACLE 中ROWNUM用法总结!

    ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...

  2. Oracle中rownum用法警示

    今天调试代码,发现分页查询时使用Oracle中rownum的between......and用法的bug,特此总结: 参考资料:http://blog.csdn.net/lg312200538/art ...

  3. 转:ORACLE 中ROWNUM用法总结!

    对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=),并非说用>,>=,=,be ...

  4. ORACLE 中ROWNUM用法总结(转载)

    原文出處:http://www.cnblogs.com/believe3301/archive/2007/10/10/919408.html 对于 Oracle 的 rownum 问题,很多资料都说不 ...

  5. oracle rownum=1什么意思,Oracle中rownum用法总结

    对于Oracle的rownum问题,很多资料都说不支持>,>=,=,between--and,只能用以上符号(,>=,=,between--and 时会提示SQL语法错误,而是经常是 ...

  6. Oracle数据库之rownum,ORACLE数据库中Rownum用法详解

    ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(,& gt;=,=, ...

  7. oracle rownum_,oracle中rownum和row_number()

    row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内 ...

  8. Oracle中rownum的说明及用法总结

    Oracle中rownum的说明及用法总结 一.rownum的说明 rownum是Oracle特有的一个关键字. (1)对于基表,在insert记录时,oracle就按照insert的顺序,将rown ...

  9. oracle中 rownum与rowid的理

    一. Oracle分页查询 我们先看学习一下oracle分页查询的语法示例,然后在具体学习用rownum的原理. /*从第1条开始,每次选N个,从第1+M个开始每次选N个*/ /**/ select  ...

最新文章

  1. ESXi主机与网络中其他主机的网咯数据包捕获
  2. 转载ASP.NET MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
  3. 为什么不走INDEX FAST FULL SCAN呢
  4. 郑州军办计算机学校,郑州市国防科技学校2019级新生开启军训模式
  5. mybatis-批量更新
  6. 链表之删除链表中间节点
  7. table 表格点击当前行按钮隐藏当前的另一个按钮_Excel表格为什么那么慢已经应该如何解决(四)一类特殊的函数易变函数(volatile function)...
  8. IntelliJ IDEA里的项目搞崩了怎么办,本地历史版本回退拯救你崩溃的心灵
  9. python--批量下载豆瓣图片
  10. php文本框清除格式,php如何清除HTML格式
  11. 目标检测(二十)--Mask R-CNN
  12. 时域离散信号/系统频域分析(matlab)零点,极点,因果,稳定
  13. adb命令刷机vivox20_vivo手机变砖 刷机手机端口连上显示adb
  14. python123课后作业嵩天_MOOC嵩天《Python语言程序设计》Python123课后作业3
  15. java乘法口诀表_java 输出乘法口诀表
  16. JavaScript(基础)——初窥门径
  17. 项目笔记 【调查问卷】
  18. python解包exe_Pyinstaller打包的EXE之解包
  19. 2018年浙江检察机关办理公益诉讼案件5551件
  20. chrome插件开发(manifest_version版本V3 + Ant Design Vue)

热门文章

  1. 2021年最有用的数据清洗 Python 库
  2. 100行代码,使用 Pygame 制作一个贪吃蛇小游戏!
  3. 机器学习和计算机视觉的前20个图像数据集
  4. 6个步骤,告诉你如何用树莓派和机器学习DIY一个车牌识别器!(附详细分析)...
  5. 从多媒体技术演进看AI技术
  6. 读8篇论文,梳理BERT相关模型进展与反思
  7. NLP重大突破?一文读懂XLNet“屠榜”背后的原理
  8. Java 24岁!Google加持的Kotlin真能取代它?
  9. 拯救老电影——详解爱奇艺ZoomAI视频增强技术的应用
  10. 借助Redis锁,完美解决高并发秒杀问题