• 【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

  • 相关阅读:
    careercup-高等难度 18.1
    面试——网络
    堆和栈的区别(转过无数次的文章)
    Linux用户空间与内核空间(理解高端内存)
    Linux内存管理
    位操作实现加减乘除四则运算
    栈的压入和弹出序列
    DG gap sequence修复一例
    ORACLE 11gR2 DG(Physical Standby)日常维护02
    oracle的特殊权限s bit丢失
  • 原文地址:https://www.cnblogs.com/NextAction/p/7366630.html
Copyright © 2020-2023  润新知