zoukankan      html  css  js  c++  java
  • 讨论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


  • 相关阅读:
    组件ListWidget 继承StatefulWidget后动态传入List数据,组件并不会重新渲染。
    Spring Security 采用httpBasic模式认证
    基于Vue2.0实现OpenLayers MarkerCluster海量聚合点标记
    Spring Security 采用formLogin模式认证
    配置页面兼容360浏览器
    如何进行企业工作流选型
    IT项目管理的六种错误思维
    时间管理10项技巧
    一个项目涉及到的50个Sql语句(下)
    SQL Server2000存储过程调试
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4569084.html
Copyright © 2011-2022 走看看