**伪列概念:**类似于表中的列,但是不存在任何表中,可以查询,不可增加、修改或者删除。
一 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