Oracle中的rownum和rowid

–注意:rownum和rowid只发生Oracle有,其它数据库是未支持的

select * from scott.dept;
–查询的结果叫做’结果集’

–rownum 伪列 ‘结果集’中起的队列
–于底下的结果集中deptno为20的rownum为2
select rownum,deptno,dname,loc from scott.dept;

–于脚的结果集中deptno为20,30的rownum分别吗1,2
select rownum,deptno,dname,loc from scott.dept where deptno in(20,30);
–rownum=1 1条数据
select rownum,deptno,dname,loc from scott.dept where rownum = 1;
–rownum=2 0条数据
select rownum,deptno,dname,loc from scott.dept where rownum = 2;
–rownum<3 2条数据
select rownum,deptno,dname,loc from scott.dept where rownum < 3;
–rownum>0 4条数据
select rownum,deptno,dname,loc from scott.dept where rownum > 0;
–rownum>1 健康理解是3长达数据,但是结果没
–没有第一长伪列,就不曾后面的伪列,伪列是从1开始递增有各个的
select rownum,deptno,dname,loc from scott.dept where rownum > 1;

/*
实践的标识称为字段
列的标识称为字段名

Oracle对rownum的处理,
rownum是于博结果集的时候有的,用于标记结果集中结果顺序的一个字段,
斯字段被名“伪数列”,也即是实在不在的一个数列。
其的特点是按照“顺序记”,而且是“逐次递增”的,
换句话说就是是只有有rownum=1的记录,才可能在rownum=2的笔录。

比方我们的询问条件伪rownum=2,那么以查询有的首先长记下之时候,
oracle标记是条记录rownum为1,结果发现跟rownum=2的条件不符,于是结果集为空。
*/

–在Oracle中,利用rownum分页,mysql:limit,sql:server top
select empno,ename from scott.emp;

–查询emp中第6-10条
–in结果集于6,10
select rownum,empno,ename from scott.emp where rownum in (6,10);
–between 结果集于6,7,8,9,10(oracle)
–没有1,不可知查询结果
select rownum,empno,ename from scott.emp where rownum between 6 and
10;
–有1,能查及结果
select rownum,empno,ename from scott.emp where rownum between 1 and 10;

–时页面数 1 每页显示数 5
–利用子查询
–between
select * from(
select rownum as tempid,empno,ename
from scott.emp
)t1
where t1.tempid between 6 and 10;

–in
select * from(
select rownum as tempid,empno,ename
from scott.emp
)t1
where t1.tempid in (6,10);

–练习:提取scott.dept中第3条-第4条记录
select * from(
select rownum as tempid,empno,ename
from scott.emp
)t1
where t1.tempid between 3 and 4;

/*
oracle还提供了另外一个数列:rowid
rowid和rownum不同,一般说来每一行数对应一个rowid,而且是稳而且唯一的.
以即时一行数存入数据库的当儿就确定了。可以了解成java对象吃的内存地址.
可利用rowid来询问记录,而且经过rowid查询记录是查询速度最好抢之询问方法.
(有哪个能记住18位长度的rowid字符?)
rowid只有在表发生位移(比如表空间别,数据导入/导出以后),才会发生变化。
*/
–查询dept表的rowid
select rowid,deptno,dname,loc from scott.dept;
–查询rowid=AAAMgxAAEAAAAAQAAA的实行数据
select * from scott.dept where rowid = ‘AAAMgxAAEAAAAAQAAA’;

–面试题

–删除重复数据
select * from tb_test;

create table tb_test(
name varchar(18),
age number
);
insert into tb_test(name,age)values(‘tom’,22);
insert into tb_test(name,age)values(‘jack’,21);
insert into tb_test(name,age)values(‘tom’,22);
insert into tb_test(name,age)values(‘alice’,22);
insert into tb_test(name,age)values(‘tom’,22);
insert into tb_test(name,age)values(‘scott’,18);
insert into tb_test(name,age)values(‘scott’,18);

–用DISTINCT 过滤重复的字段
SELECT distinct name from tb_test
/*
复数据:tom 22[3] scott 18[2]
1.剔除所有又数据
2.抹重复数据Oracle,但是保留一条(保留最老之rowid或者最好小)
*/
–1
DELETE FROM tb_test
–此处WHERE nam IN将会见将于子查询语词被所获得的name都剔除掉
WHERE name IN(
SELECT name
FROM tb_test
GROUP BY name
HAVING COUNT(name)>1
);

–保留一漫长
–1.通过创建临时表(ddl语句操作,很快)
–注意:使用distinct这种艺术只能适用于复数据是颇具列
–当字段比较多(name,age,sex,address,phone…),但是判断还只是name和age字段,如果是sex呢?就不克以distinct了
create table tb_tmp as select distinct name,age from tb_test;
–清空表记录
–截断
truncate table tb_test;
–将临时表中之数码插回来
insert into tb_test(name,age) select name,age from tb_tmp;
select * from tb_tmp;

–查看tom的rowid
select rowid,name,age from tb_test where name=’tom’ and age=22;

–这里max使用min也可以
–把不以最酷唯一rowid的仍name,age分组的数据删除掉
delete from tb_test where rowid not in(
–查询唯一rowid
–按照最老的rowid,name,age分组,这样分组后的数额还存有唯一性,不以分组内的多寡还应该受剔除掉
select MAX(rowid) from tb_test group by name,age
);

delete from tb_test where rowid not in
(
select MIN(rowin) from tb_test group by name,age
);

相关文章