Oracle中rownum的用法总结
日期:2019/5/22
内容:oracle;数据库;rownum
数据库查询中,常用到"选取前X个"这样的问题,Oracle没有TOP关键字,这类问题都是通过rownum选取某几行来完成的。
先说结论
rownum不支持>, >=, =, !=, between...and...这几个运算符,只能用符号(<、<=)
例子1:选取列表的前三行

例子2:选取列表第10行及以后的记录
第一次学Oracle,可能都会这么写:
(错误解法warning)


原因:ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除, 接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。
(总的来说,查询就是逐条筛选,这条不行下一条来上)
(正确解法Tips)
先把rownum的列与table"拼接"作为一个子表来查询,这样rownum所在的列就是代表一个属性(对属性筛选当然是没问题的)

注意下图红框的部分。

例子3:选取列表中某个值前3的所有记录
例如:
- 选取薪水SAL前三的人
- 选取成绩倒数前三的人
Key Points:
- 前3不代表只是三个,因为有可能存在并列第一/第二
解决思路:先排序(根据实际决定升序还是降序),再选取前3行
例如:选取SAL前3的SNAME
先选出SAL前3的三个数值:
(刚开始学可能会这么写,错误warning:这种写法是先选列表的1,2,3行再排序)

(你可能会想:嵌套查询,把排序后的结果作为查询目标,错误warning:最值5000多个并列)

正确解法:
- 先排序去重
select distinct sal from emp order by sal desc;
- 再选出前3的sal

- 再从所有的记录中筛选sal在上述集合{5000,3000,2975}中的记录
select [col1, col2] from emp where sal in [set as above]

例子4:选取区间[a,b]的记录
上述解决了"前n个"即1<=rownum<=n这一类问题,但是并没有解决a<=rownum<=b这样更为通用的问题。但其实稍加改变就能够解决这个问题。
回想一下例子2的操作:把行号rownum"拼接"到一个表,让rownum变为表的一个属性。
(截图不完全)

然后对R属性筛选

现在来搞点更复杂的:找出薪水排名在2到4的(R, ENAME, SAL),注意考虑排名并列的问题
- sal排名(2-4:3000,2975,2850)

- 先添加几个重复排名的(红框就是我们的筛选目标)

解决步骤:
- 先找出集合{3000,2975,2850}

- 再select [col1,...] from emp where sal in <set as above>

到这一步,筛选区间[a,b]的记录计算完成了。红框中即是修改[a,b]的地方。
如果本文有错误,欢迎指出。
如果您有更好的解法,欢迎交流。
Oracle中rownum的用法总结的更多相关文章
- Oracle中rownum的用法
rownum是Oracle对查询结果进行顺序编号,第一行分配1,第二行2,以此类推.rownum不能以任何表的名称作为前缀. rownum这个伪字段可以用于控制返回的记录行数. 例如表:student ...
- ORACLE 中ROWNUM用法总结(转)
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
- ORACLE 中ROWNUM用法总结!
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
- Oracle中rownum的基本用法
Oracle中rownum的基本用法 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且r ...
- 转:ORACLE 中ROWNUM用法总结!
oracle 分页查询语句:select * from (select u.*,rownum r from (select * from userifno) u where rownum<大值) ...
- Oracle中rownum用法警示
今天调试代码,发现分页查询时使用Oracle中rownum的between......and用法的bug,特此总结: 参考资料:http://blog.csdn.net/lg312200538/art ...
- oracle 中 rownum 和 row_number()
简单的介绍下oracle 中rownum 和 row_number() 使用,实例演示. 参照:http://www.cnblogs.com/zjrstar/archive/2006/08/31/49 ...
- oracle中to_date详细用法示例(oracle日期格式转换)
这篇文章主要介绍了oracle中to_date详细用法示例,包括期和字符转换函数用法.字符串和时间互转.求某天是星期几.两个日期间的天数.月份差等用法 TO_DATE格式(以时间:2007-11-02 ...
- ORACLE 中ROWNUM
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
随机推荐
- 从5个经典工作开始看语义SLAM
本文试图概括Semantic SLAM的主要思路和近年工作,⻓期更新.但因水平有限,若有错漏,感谢指正. (更好的公式显示效果,可关注文章底部的公众号) Semantic SLAM 简介 至今为止,主 ...
- 搭建websocket消息推送服务,必须要考虑的几个问题
近年,不论是正在快速增长的直播,远程教育以及IM聊天场景,还是在常规企业级系统中用到的系统提醒,对websocket的需求越来越大,对websocket的要求也越来越高.从早期对websocket的应 ...
- 使用GitHub(二):配置并使用Git创建版本库
使用GitHub(二):配置并使用Git创建版本库 本文简单介绍使用GitHub对代码进行版本控制,包括添加SSHkey.配置Git.使用Git创建版本库并在GitHub上进行管理,主要目的是对学习内 ...
- 使用CSS实现折叠面板总结
任务目的 深入理解html中radio的特性 深入理解CSS选择器以及伪元素的使用 任务描述 使用input的radio单选框特性结合CSS中的伪元素实现bootstrap中折叠面板(点击查看样例), ...
- 东南大学RM装甲板识别算法详解
rm中,装甲板的识别在比赛中可谓是最基础的算法.而在各个开源框架中,该算法也可以说最为成熟.出于学习目的,之后将对比多个高校或网络代码(),尝试学习各个rm装甲板识别算法的优点和流程. 这次先是东南大 ...
- JAVA有关位运算的全套梳理
一.在计算机中数据是如何进行计算的? 1.1:java中的byte型数据取值范围 我们最开始学习java的时候知道,byte类型的数据占了8个bit位,每个位上或0或1,左边第一位表示符号位,符号位如 ...
- new Date在IOS下面的兼容问题
此问题坑爹啊,着实坑爹,要不是本宝宝鬼机灵再次进行了测试,不然测试都测不出来的问题,问题源头,有两个时间: let start = "2018-08-08 00:00:00" ; ...
- php实现post跳转
大家否知道php可以利用header('Location')实现get请求跳转. php利用curl可以实现模拟post请求. 但是却找不到php现成的实现post跳转.那么问题来了,如果有这个需求该 ...
- Python数据科学手册(2) NumPy入门
NumPy(Numerical Python 的简称)提供了高效存储和操作密集数据缓存的接口.在某些方面,NumPy 数组与 Python 内置的列表类型非常相似.但是随着数组在维度上变大,NumPy ...
- Robotutor Scratch3.0 在线编程平台升级啦!
Robotutor推出的Scratch3.0在线编程平台受到很多编程老师和学员的喜爱,上一个版本我们提供了用户注册,找回密码,个人项目的在线保存和浏览,社区分享评论. 我们根据实际的教学需要,用户角色 ...