oracle roenum,数据的伪列 ROENUM ROWID

数据伪列指的是用户不需要 处理的列,而是由Oracle自行维护的数据列,在Oracle之中有两个数据伪劣:ROWNUM和ROWID。

ROWNUM

ROWNUM(重点):为每一个显示的记录自动的随着查询生成行号。例如(scott/tiger下的emp表为例):

select ROWNUM ,empno,ename,empjob,hiredate from emp;

0818b9ca8b590ca3270a3433284dd417.png

ROWNUM 并不是永久固定的;是每次动态的重新生成。例如:

select ROWNUM ,empno,ename,empjob,hiredate from emp where deptno=30;

0818b9ca8b590ca3270a3433284dd417.png

ROWNUM可实现数据的部分显示。

例如:查询前五条

select ROWNUM ,empno,ename,empjob,hiredate from emp where ROWNUM<=5;

0818b9ca8b590ca3270a3433284dd417.png

查询6~10条:不能直接用select ROWNUM ,empno,ename,empjob,hiredate from emp where ROWNUM between  6 and 10;

0818b9ca8b590ca3270a3433284dd417.png

因为ROWNUM不是真实列,要想正真实现这种查询思路是:先查询前10条,之后在显示后5条;依靠子查询实现:

select * from (

select ROWNUM  rn,empno,ename,empjob,hiredate from emp

where ROWNUM<=10)  temp

where temp.rn>5;

0818b9ca8b590ca3270a3433284dd417.png

按照这个思路可实现分页功能:

例如:显示前5条记录;当前所在页(currentPage)为1;每页显示的记录长度为5;

第一页:

select * from (

select ROWNUM  rn,empno,ename,job,hiredate from emp

where ROWNUM<=5)  temp

where temp.rn>0;

0818b9ca8b590ca3270a3433284dd417.png

例如:显示中间5条记录;当前所在页(currentPage)为2;每页显示的记录长度为5;

第二页:

select * from (

select ROWNUM  rn,empno,ename,job,hiredate from emp

where ROWNUM<=10) temp

where temp.rn>5;

0818b9ca8b590ca3270a3433284dd417.png

例如:显示第三页的内容;当前所在页(currentPage)为3;每页显示的记录长度为5;

第三页:

select * from (

select ROWNUM  rn,empno,ename,job,hiredate from emp

where ROWNUM<=15) temp

where temp.rn>10;

0818b9ca8b590ca3270a3433284dd417.png

ROWID

ROWID表示的是每一行数据保存的物理地址的编号。

例如:select ROWID,deptno,dname,loc from dept;

0818b9ca8b590ca3270a3433284dd417.png

每一条记录的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;

0818b9ca8b590ca3270a3433284dd417.png

要求删除重复行,使其最终显示效果如下:

0818b9ca8b590ca3270a3433284dd417.png

先按照查询的方式做,首先找到所有的重复数据。为此,先按照部门的名称和位置分组,之后统计个数,

如果个数大于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目前最常用用途。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值