讨论oracle在rowid和rownum
[ 概要 ]
刚刚接触oracle的同学可能经常会被rowid和rownum这两个词弄混, 弄清楚这两个家伙对于我们写sql会有非常大的帮助, 以下偶就抛砖引玉, 简单地谈谈他们之间的差别吧.
[ 比較 ]
rowid和rownum都是oracle中的伪列, 但他们还是存在本质差别:
rowid: 是物理地址, 用于定位数据表中数据的位置, 它是唯一的且不会改变.
rownum: 是依据查询的结果集给每行分配的一个逻辑编号, 查询结果不同, rownum自然不同.
对于同一条记录, 查询条件不同, rownum会不同, 可是rowid将不变.
演示样例: 查询公司全部的员工
select rowid, rownum, empno, ename from emp;
演示样例: 查询公司员工姓名包括'S'
select rowid, rownum, empno, ename from emp where ename like '%S%';
细心的同学不难发现, 对于一行记录, rowid没变, rownum变了. 比如: 姓名为'SMITH'的员工.
[ 陷阱 ]
1. rownum仅仅支持符号<、<=、!=, 不支持>, >=, =, between...and
select * from emp where rownum > 10 -- 没有结果
select *
from (select rownum row_num, e.* from emp e) emp_temp
where emp_temp.row_num > 10; -- 能够获取十位以后记录
解释一下: 由于rownum是对结果集加的一个伪列, 即先查到结果集之后再加上去的一个列(强调: 要有结果集). 简单地说rownum是符合条件结果的序列号, 它总是从1開始排位, 所以你选出的结果不可能没有1, 而有大于1的值.
有了上面的知识, 我们就不难解释下面现象:
① 为什么select * from emp where rownum != 10 总是返回前9条记录?
由于查询到结果集后, 显示完第9条记录, 之后的记录都是 != 10.
② 为什么rownum > 1 查不到一条记录, 而rownum > 0 或 rownum >= 1 却总显示全部记录?
由于rownum是在查询到结果集之后加上去的, 它总是从1開始.
③ 为什么between 1 and 10 或者 between 0 and 10 能查到结果, 而between 2 and 10却得不到结果?
原因同上, 少了rownum=1就像空中楼阁一样不能存在.
[ 应用 ]
废话扯了一箩筐, 这两哥们究竟有啥用呢?
嘿嘿, 别急, 以下就上正菜...
问题: 获取薪水排名前三的员工
分析: 假设是sql server就好了, 我们能够使用topkeyword, oracle中我们用rownum也能解决
select *
from (select * from emp order by sal desc)
where rownum <= 3
order by rownum asc
讨论oracle在rowid和rownum的更多相关文章
- Oracle的RowId和Rownum
本文参照来自:https://www.cnblogs.com/whut-helin/p/8024860.html 由sql select p.*,rowid,rownum from promotion ...
- oracle 的rowid和rownum
rowid就是唯一标志记录物理位置的一个id,对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行 ...
- 【转载】oracle之rowid详解
原文URL:http://www.2cto.com/database/201109/104961.html 本文讨论的是关于oracle从8i开始引进object的概念后的rowid,即扩展(exte ...
- 使用rowid和rownum获取记录时要注意的问题
我们知道.rowid和rownum在Oracle中都是能够被当做伪劣使用的,主要用来定位表中特定的记录,但它们是有差别的,rowid是和行记录的物理地址相应的.而rownum则不是,是通过返回的记录集 ...
- oracle_SQL中ROWID与ROWNUM的使用(转)
转自:http://www.360doc.com/content/12/0802/11/219024_227802569.shtml rownum: ROWNUM是对结果集加的一个伪列, 即先查到结果 ...
- Oracle-12:伪列rowid和rownum
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 伪列:不真实存储在真表中,但是我们可以查询到不能对伪列进行增删改操作! 分页可以用rownum来分!!!!!! ...
- Rowid和Rownum
Rowid和Rownum对于数据库开发人员来说基本很少用到,因为在企业数据库开发中大多都是进行数据批处理,但是对于其他数据库人员来说还是会用到的. rowid和rownum都是虚列,但含义完全不同.r ...
- 各种数据库分页语句整理以及Oracle数据库中的ROWNUM和ORDER BY的区别
.oracle数据库分页 select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=s ...
- oracle 之 伪列 rownum 和 rowid的用法与区别
rownum的用法 select rownum,empno,ename,job from emp where rownum<6 可以得到小于6的值数据 select rownum,empno, ...
随机推荐
- lock订单号
常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...
- 如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等(转)
你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并行的操作.数据专家们,我是在对你们说.你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, ...
- Swing程序最佳架构设计—以业务对象为中心的MVC模式(转)
前言: 我打算写一系列关于Swing程序开发的文章.这是由于最近我在做一个Swing产品的开发.长期做JavaEE程序,让我有些麻木了.Swing是设计模式的典范,是一件优雅的艺术品,是一件超越时代的 ...
- 设置Windows 8.1屏幕自己主动旋转代码, Auto-rotate function code
程序代码实现启用或禁用Windows 8.1 Tablet的自己主动旋转功能 方法一:使用SetDisplayAutoRotationPreferences函数功能 #include <Wind ...
- HDOJ 4687 Boke and Tsukkomi 一般图最大匹配带花树+暴力
一般图最大匹配带花树+暴力: 先算最大匹配 C1 在枚举每一条边,去掉和这条边两个端点有关的边.....再跑Edmonds得到匹配C2 假设C2+2==C1则这条边再某个最大匹配中 Boke and ...
- Xamarin.Android 在VS下调试时提示 In mgmain JNI_OnLoad 程序“Mono”已退出 解决办法
原因是使用了破解版的 Xamarin,调试时不能使用共享库
- java: org.luaj.vm2.LuaError:XXX module not found lua脚本初始化出错(转)
我遇到这个错误是因为在引用脚本目录时,设置错了位置.设置成脚本所在目录的上级目录. lua使用和加载初始化方法 在java中使用lua,使用需要引用 luaj-jse-2.0.2.jar 同时需要使用 ...
- android登陆接口调试
最近项目要开始调API,于是自己写了个关于登陆界面调试的Demo,为了保护项目,接口文档里面的内容都是被我改过的,不涉及任何项目内容.当然,代码在运行成功后,上传至博客前,相应内容我也根据改过后的文档 ...
- Linux下 高性能、易用、免费的ASP.NET服务器
Linux下 高性能.易用.免费的ASP.NET服务器 http://www.jexus.org/#
- 使用Bootstrap 他写道网站
新发现vdceye有些难看的网站,为了找到一个bootstrap工具,我一次又一次地写信给网站 这个工具是很容易使用 http://vdceye.com/ 版权声明:本文博客原创文章,博客,未经同意, ...