zoukankan      html  css  js  c++  java
  • 【SQL】ROWNUM和ROWID

    一、ROWNUM

    ROWNUM伪列是Oracle先查到结果集之后再加上去的一个伪列,这个伪列对符合条件的结果添加一个从1开始的序列号,并且序列号是从1开始增序排列的。

    SQL> select rownum ,deptno,dname,loc from dept;

     

        ROWNUM     DEPTNO DNAME          LOC

    ---------- ---------- -------------- -------------

             1         10 ACCOUNTING     NEW YORK

             2         20 RESEARCH       DALLAS

             3         30 SALES          CHICAGO

             4         40 OPERATIONS     BOSTON

    WHERE子句中使用ROWNUM可以起到过滤效果,这样我们可以很方便的取出结果集的任一位置的数据。

    SQL> select rownum,deptno,dname,loc from dept where rownum<=3;

     

        ROWNUM        DEPTNO DNAME          LOC

     ---------- ---------- -------------- -------------

             1         10 ACCOUNTING     NEW YORK

             2         20 RESEARCH       DALLAS

             3         30 SALES          CHICAGO

    二、ROWID

    ROWID伪列是一种数据类型,它使用基于64位编码的18个字符来唯一标识一条记录的物理位置的一个ID(ROWID=6位数据对象编号+3位文件编号+6位块编号+3位行编号)。ROWID类似于主键,不同的是ROWNUM一般情况下是按照递增的顺序排列的。

    SQL> select rowid,deptno,dname,loc from dept;

     

    ROWID                  DEPTNO DNAME          LOC

    ------------------ ---------- -------------- -------------

    AAAVRCAAEAAAACHAAA         10 ACCOUNTING     NEW YORK

    AAAVRCAAEAAAACHAAB         20 RESEARCH       DALLAS

    AAAVRCAAEAAAACHAAC         30 SALES          CHICAGO

    AAAVRCAAEAAAACHAAD         40 OPERATIONS     BOSTON

     

    ROWID的一重要作用是,查询和删除表中的重复记录。

    (1)查询表中的重复记录

    SQL> select * from emp_rowid where rowid not in

      2  (select min(rowid) from emp_rowid group by empno);

     

         EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

          7844 TURNER     SALESMAN        7698 1981-09-08 00:00:00       1500          0         30

    (2)删除表中的重复记录

    SQL> delete from emp_rowid where rowid not in (select min(rowid) from emp_rowid group by empno);

     

    13 rows deleted.

    三、ROWID和ROWNUM的区别

    ROWID是物理存在的;而ROWNUM是动态的,先查到结果集后再加上去的一个列,因此必须先有结果集。

    如果编写条件查询ROWNUM>5的记录,而查询结果集中没有多余5条记录,所以查询结果会是空。

    SQL> select * from dept;

     

        DEPTNO DNAME          LOC

    ---------- -------------- -------------

            10 ACCOUNTING     NEW YORK

            20 RESEARCH       DALLAS

            30 SALES          CHICAGO

            40 OPERATIONS     BOSTON

     

    SQL> select * from dept where rownum>10;

     

    no rows selected

  • 相关阅读:
    从零起步搭建Hadoop单机和伪分布式开发环境图文教程
    使用DOM技术操纵文档
    求数组的子数组之和的最大值
    设计时(DesignTime)和运行时(RunTime)的区别
    ubuntu上ssh客户端应用
    创建一个简单的基于MVC的Django项目
    终结点与服务寄宿
    Google文件系统(GFS)翻译学习
    模板引擎开发(二)值标签的处理
    移动App服务端架构设计
  • 原文地址:https://www.cnblogs.com/NextAction/p/7366630.html
Copyright © 2011-2022 走看看