[ 概要 ]

刚刚接触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的更多相关文章

  1. Oracle的RowId和Rownum

    本文参照来自:https://www.cnblogs.com/whut-helin/p/8024860.html 由sql select p.*,rowid,rownum from promotion ...

  2. oracle 的rowid和rownum

    rowid就是唯一标志记录物理位置的一个id,对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行 ...

  3. 【转载】oracle之rowid详解

    原文URL:http://www.2cto.com/database/201109/104961.html 本文讨论的是关于oracle从8i开始引进object的概念后的rowid,即扩展(exte ...

  4. 使用rowid和rownum获取记录时要注意的问题

    我们知道.rowid和rownum在Oracle中都是能够被当做伪劣使用的,主要用来定位表中特定的记录,但它们是有差别的,rowid是和行记录的物理地址相应的.而rownum则不是,是通过返回的记录集 ...

  5. oracle_SQL中ROWID与ROWNUM的使用(转)

    转自:http://www.360doc.com/content/12/0802/11/219024_227802569.shtml rownum: ROWNUM是对结果集加的一个伪列, 即先查到结果 ...

  6. Oracle-12:伪列rowid和rownum

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 伪列:不真实存储在真表中,但是我们可以查询到不能对伪列进行增删改操作! 分页可以用rownum来分!!!!!! ...

  7. Rowid和Rownum

    Rowid和Rownum对于数据库开发人员来说基本很少用到,因为在企业数据库开发中大多都是进行数据批处理,但是对于其他数据库人员来说还是会用到的. rowid和rownum都是虚列,但含义完全不同.r ...

  8. 各种数据库分页语句整理以及Oracle数据库中的ROWNUM和ORDER BY的区别

    .oracle数据库分页 select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=s ...

  9. oracle 之 伪列 rownum 和 rowid的用法与区别

    rownum的用法 select  rownum,empno,ename,job from emp where rownum<6 可以得到小于6的值数据 select rownum,empno, ...

随机推荐

  1. 802.11(wi-fi)的PHY层(编码与调制方法)

    版本概要: 802.11-2007是目前的基础版本,之前的过时版本不考虑. 2009是较新的版本,就是目前最普及的802.11n.(100Mb/s) 2012就是传说中的802.11ac,工作在5G, ...

  2. Windows 8 应用开发 - 异步调用

    原文:Windows 8 应用开发 - 异步调用     不论是桌面客户端还是Web应用通常会出现处理时间较长的操作,为了在这段时间内不影响用户与应用之间的交互体验,开发人员通常会使用异步调用技术,使 ...

  3. 如何:使用 Visual Studio 中的一键式发布来部署 Web 应用程序项目

    原文: 如何:使用 Visual Studio 中的一键式发布来部署 Web 应用程序项目 本主题介绍如何在以下产品中使用 一键式发布 发布(部署)Web 应用程序项目: Visual Studio ...

  4. Sliverlight实例之 使用 ControlTemplate 自定义按钮的外观

    按钮,最终效果,如下图: 见Project21_ButtonSkin 1, 创建Sliverlight项目 说明: generic.xaml:样式和模板就被定义在这个文件里 MyButton.cs:控 ...

  5. 7、Cocos2dx 3.0游戏开发找小三之3.0版本号的代码风格

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已 ...

  6. JDBC batch批量Statement executeBatch 详细解释

    JDBC提供了数据库batch处理的能力,在数据大批量操作(新增.删除等)的情况下能够大幅度提升系统的性能.我曾经接触的一个项目,在没有採用batch处理时,删除5万条数据大概要半个小时左右,后来对系 ...

  7. WEB安全实战(一)SQL盲注

    前言 好长时间没有写过东西了,不是不想写,仅仅只是是一直静不下心来写点东西.当然,拖了这么长的时间,也总该写点什么的.近期刚刚上手安全方面的东西,作为一个菜鸟,也本着学习的目的,就谈谈近期接触到的安全 ...

  8. iOS 中client和server的 Web Service 网络通信 (2)

    在实际的应用开发过程中,同步请求的用户体验并非非常好:我们都知道.Apple是非常重视用户体验的.这一点也成为了行业的标杆,没实用户哪里来的好产品.所以用户体验是极其重要的.貌似废话有点多.接下来进入 ...

  9. A ResourcePool could not acquire a resource from its primary factory or source

    出处:http://aaron81939097.iteye.com/blog/1144642 原配置: <bean id="dataSource" class="c ...

  10. Duanxx的Design abroad: C++矩阵运算库Eigen 概要

    一.概要 这两天想起来要做神经网络的作业了,要求用C++完毕神经网络的算法. 摆在面前的第一个问题就是,神经网络算法中大量用到了矩阵运算.可是C++不像matlab那样对矩阵运算有非常好的支持.本来准 ...