数据伪列指的是用户不需要 处理的列,而是由Oracle自行维护的数据列,在Oracle之中有两个数据伪劣:ROWNUM和ROWID。
ROWNUM
ROWNUM(重点):为每一个显示的记录自动的随着查询生成行号。例如(scott/tiger下的emp表为例):
select ROWNUM ,empno,ename,empjob,hiredate from emp;
ROWNUM 并不是永久固定的;是每次动态的重新生成。例如:
select ROWNUM ,empno,ename,empjob,hiredate from emp where deptno=30;
ROWNUM可实现数据的部分显示。
例如:查询前五条
select ROWNUM ,empno,ename,empjob,hiredate from emp where ROWNUM<=5;
查询6~10条:不能直接用select ROWNUM ,empno,ename,empjob,hiredate from emp where ROWNUM between 6 and 10;
因为ROWNUM不是真实列,要想正真实现这种查询思路是:先查询前10条,之后在显示后5条;依靠子查询实现:
select * from (
select ROWNUM rn,empno,ename,empjob,hiredate from emp
where ROWNUM<=10) temp
where temp.rn>5;
按照这个思路可实现分页功能:
例如:显示前5条记录;当前所在页(currentPage)为1;每页显示的记录长度为5;
第一页:
select * from (
select ROWNUM rn,empno,ename,job,hiredate from emp
where ROWNUM<=5) temp
where temp.rn>0;
例如:显示中间5条记录;当前所在页(currentPage)为2;每页显示的记录长度为5;
第二页:
select * from (
select ROWNUM rn,empno,ename,job,hiredate from emp
where ROWNUM<=10) temp
where temp.rn>5;
例如:显示第三页的内容;当前所在页(currentPage)为3;每页显示的记录长度为5;
第三页:
select * from (
select ROWNUM rn,empno,ename,job,hiredate from emp
where ROWNUM<=15) temp
where temp.rn>10;
ROWID
ROWID表示的是每一行数据保存的物理地址的编号。
例如:select ROWID,deptno,dname,loc from dept;
每一条记录的ROWID都不会重复,所以即便表中所有列的数据内容都重复了,RPWID也不会重复。以一个ROWID为例,
说明ROWID组成,例如:AAAR3qAAEAAAACHAAA
* 数据对象号:AAAR3q;
*相对文件号:AAE;
*数据块号:AAAACH;
*数据行号:AAA;
应用:删除表中的重复记录
例子:(dept),为了说明问题,向表中插入几条记录;
insert into dept(deptno,dname,loc) values(21,'RESEARCH','DALLAS');
insert into dept(deptno,dname,loc) values(31,'SALES','CHICAGO');
insert into dept(deptno,dname,loc) values(32,'SALES','CHICAGO');
insert into dept(deptno,dname,loc) values(41,'OPERATIONS','BOSTON');
insert into dept(deptno,dname,loc) values(42,'OPERATIONS','BOSTON');
insert into dept(deptno,dname,loc) values(43,'OPERATIONS','BOSTON');
commit;
重新查看dept表数据
select * from dept;
要求删除重复行,使其最终显示效果如下:
先按照查询的方式做,首先找到所有的重复数据。为此,先按照部门的名称和位置分组,之后统计个数,
如果个数大于1,则表示重复。
SQL命令:
select dname ,loc,min(ROWID)
from dept
group by dname,loc
having count(deptno)>1;
此时返回的ROWID,与最初的比较:
发现数据插入的越早,rowid就越小,所以下一步确定那些是不能删除的rowid,去掉之前的限制,
表示按照部门名称和位置放入分组,取出最小的一个rowid;
SELECT MIN(ROWID) FROM DEPT GROUP BY DNAME,LOC;
以上的数据是不能删除的数据,所以delete语句是;
delete from dept
where rowid not in(SELECT MIN(ROWID) FROM DEPT GROUP BY DNAME,LOC);
最后记得提交;
commit;
这就是rowid目前最常用用途。