日期: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的用法总结的更多相关文章

  1. Oracle中rownum的用法

    rownum是Oracle对查询结果进行顺序编号,第一行分配1,第二行2,以此类推.rownum不能以任何表的名称作为前缀. rownum这个伪字段可以用于控制返回的记录行数. 例如表:student ...

  2. ORACLE 中ROWNUM用法总结(转)

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

  3. ORACLE 中ROWNUM用法总结!

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

  4. Oracle中rownum的基本用法

    Oracle中rownum的基本用法 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且r ...

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

    oracle 分页查询语句:select * from (select u.*,rownum r from (select * from userifno) u where rownum<大值) ...

  6. Oracle中rownum用法警示

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

  7. oracle 中 rownum 和 row_number()

    简单的介绍下oracle 中rownum 和 row_number() 使用,实例演示. 参照:http://www.cnblogs.com/zjrstar/archive/2006/08/31/49 ...

  8. oracle中to_date详细用法示例(oracle日期格式转换)

    这篇文章主要介绍了oracle中to_date详细用法示例,包括期和字符转换函数用法.字符串和时间互转.求某天是星期几.两个日期间的天数.月份差等用法 TO_DATE格式(以时间:2007-11-02 ...

  9. ORACLE 中ROWNUM

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

随机推荐

  1. 安卓权威编程指南 -笔记(18章 处理assets)

    resources资源可以存储声音文件,但当处理多个音乐文件时,效率会很低. assets可以被看作随应用打包的微型文件系统,支持任意层次的文件目录结构.类似游戏这样需要加载大量图片和声音资源的应用通 ...

  2. [置顶] 利用Python 提醒实验室同学值日(自动发送邮件)

    前言: 在实验室里一直存在着一个问题,就是老是有人忘记提醒下一个人值日,然后值日就被迫中断了.毕竟良好的        卫生环境需要大家一起来维护的!没办法只能想出一些小对策了. 解决思路: 首先,我 ...

  3. C++走向远洋——25(项目二,游戏类)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:game.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  4. Pandorabox固件路由器上申请Let's Encrypt证书,为内网里的多个web服务提供SSL支持

    对于家中宽带有公网IP的用户,有时我们需要将路由器内部网络的某些web服务通过端口转发暴露到外网(例如NAS远程访问),但HTTP是明文传输,有被监听的风险:如果在NAS上使用自签名证书,再端口转发, ...

  5. 基于Blazor写一个简单的五子棋游戏

    写这个五子棋游戏,其实主要目的是想尝试一下微软新作Blazor.Blazor对于那些搞.NET的程序员,又想做一些前端工作,真的挺友好,不用一句JS就可搞定前端交互,美哉.现在已经有很流行的前端框架, ...

  6. cocoapods iOS类库管理工具的安装与使用

    CocoaPods是一个管理Swift和Objective-C的Cocoa项目的依赖工具.他可以优雅地帮助你扩展你的项目.简单的说,就是替你管理Swift和Objective-C的Cocoa项目的第三 ...

  7. Python基本小程序

    目录 Python基本小程序 一.筛选从1-100所有的奇数 二.筛选从0-100所有的偶数 三.求1-100之间所有的偶数和,奇数和 四.三个数由小到大输出 五.四个数字重复数字的三位数 Pytho ...

  8. App崩溃监控

    常见马虎导致崩溃 1 数组越界: 2 多线程问题,在子线程刷新UI: 3 主线程无响应,主线程超过系统规定的时间没有响应,就会被watchdog杀掉: 4 野指针: 崩溃信息的收集却并没有那么简单.因 ...

  9. JUC-八锁现象和不安全锁

    1,被 synchronized 修饰的方法,锁的对象是方法的调用者(实例对象) 2,被 static 修饰的方法,锁的对象就是 Class模板对象,这个则全局唯一 问题7: 一个普通同步方法,一个静 ...

  10. 基于JS正则实现模板数据动态渲染

    最近业务上需要动态渲染模板数据: 一.业务需求: 1.前端后端定义好模板以及变量名,根据打印机类型转换成对应sdk需要的标签模板,保存数据库 2.订单数据是前端根据支付结果获取的,最终渲染完的数据模板 ...