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

  • 相关阅读:
    ajax专题
    luogu P1346 电车 最短路
    luogu P1462 通往奥格瑞玛的道路 最短路
    luogu P1328 生活大爆炸版石头剪刀布
    luogu P1315 联合权值 枚举
    luogu P1156 垃圾陷阱 背包问题
    luogu P1217 回文质数 枚举
    luogu P3650 滑雪课程设计 枚举
    luogu1209 修理牛棚 贪心
    luogu P1223 排队接水 贪心
  • 原文地址:https://www.cnblogs.com/NextAction/p/7366630.html
Copyright © 2011-2022 走看看