Oracle修炼路程--伪列rowid及rownum

**伪列概念:**类似于表中的列,但是不存在任何表中,可以查询,不可增加、修改或者删除。
一 rownum
ronum:
1 逻辑伪列:比如1 2 3 4 5 6 。。

SQL> select rownum,e.* from emp e;

    ROWNUM      EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
         1       5741 QIN_JIALI  CLERK           7654 20-3-85           1900        600         20
         2       7369 SMITH      CLERK           7902 17-12-80           1200                    20
         3       7499 ALLEN      SALESMAN        7698 20-2-81           2000        300         30
         4       7521 WARD       SALESMAN        7698 22-2-81           1650        500         30
         5       7566 JONES      MANAGER         7839 02-4-81           4575                    20
         6       7654 MARTIN     SALESMAN        7698 28-9-81           1650       1400         40
         7       7698 BLAKE      MANAGER         7839 01-5-81           4450                    30
         8       7782 CLARK      MANAGER         7839 09-6-81           4050                    10
         9       7788 SCOTT      ANALYST         7566 19-4-87           3400                    20
        10       7839 KING       PRESIDENT            17-11-81           7000                    10
        11       7844 TURNER     SALESMAN        7698 08-9-81           1900                    30
        12       7876 ADAMS      CLERK           7788 23-5-87           1500                    20
        13       7900 JAMES      CLERK           7698 03-12-81           1350                    30
        14       7902 FORD       ANALYST         7566 03-12-81           3400                    20
        15       7934 MILLER     CLERK           7782 23-1-82           1700                    10

已选择15行。

--查询工资最高的前3名员工信息;
SQL> select rownum,ename,sal from(select *from emp order by sal desc) where rownum<=3;

    ROWNUM ENAME             SAL
---------- ---------- ----------
         1 KING             7000
         2 JONES            4575
         3 BLAKE            4450

说明:
1)执行不同SQL,rownum的值不一致;
2)执行相同SQL,rownum的值不变;

TOP-N:查询前n个数据:
通用做法:
select rownum,…from (select *from xxx order by…) where rownum<=n;

二 rowid
物理序列。
说明:
具有18位的物理地址;
前6位是数据对象编号,每个对象具有很多数据文件,而数据文件是由数据块组成;
依次往后3位:数据文件编号;
依次往后6位:数据块编号;
依次最后3位:行号;
根据插入数据的顺序,依次递增;
在这里插入图片描述
三 rownum/rowid的用法举例:
– 删除重复数据
–根据编号分组(将重复的数据放到一组),然后对于每组,取出来最大或者最小rowid进行保留一个即可;

--创建表格stu
SQL> create table stu(id number,stuname varchar2(20));

表已创建。
--插入数据
SQL> insert into stu values(12,'QINJIALI');

已创建 1 行。

SQL> insert into stu values(13,'QINWEIGUANG');

已创建 1 行。

SQL> insert into stu values(12,'QINJIALI');

已创建 1 行。

SQL> insert into stu values(13,'QINWEIGUANG');

已创建 1 行。

SQL> insert into stu values(12,'QINJIALI');

已创建 1 行。

SQL> insert into stu values(13,'QINWEIGUANG');

已创建 1 行。

SQL> insert into stu values(12,'QINJIALI');

已创建 1 行。

SQL> insert into stu values(13,'QINWEIGUANG');

已创建 1 行。
--提交
SQL> COMMIT;

提交完成。
--查询表格数据
SQL> select *from stu;

        ID STUNAME
---------- --------------------
        12 QINJIALI
        13 QINWEIGUANG
        12 QINJIALI
        13 QINWEIGUANG
        12 QINJIALI
        13 QINWEIGUANG
        12 QINJIALI
        13 QINWEIGUANG

已选择8行。
--去除重复数据
SQL> delete from stu where rowid not in(select min(rowid) from stu group by id);

已删除6行。
--验证结果,删除完毕。
SQL> select *from stu;

        ID STUNAME
---------- --------------------
        12 QINJIALI
        13 QINWEIGUANG


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值