数据库 ----连表查询篇
一、rowid 和 rownum
ROWID 是 ORACLE 中的一个重要的概念。用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。ROWID 它是一个伪列,它并不实际存在于表中。它是 ORACLE 在读取表中数据行时,根据每一行数据的物理地址信息编码而成的一个伪列。所以根据一行数据的 ROWID 能找到一行数据的物理地址信息。从而快速地定位到数据行。数据库的大多数操作都是通过 ROWID 来完成的,而且使用 ROWID 来进行单记录定位速度是最快的。我们可以将其用于删除重复数据。
ROWNUM 是一种伪列,它会根据返回记录生成一个序列化的数字。排序后的结果集的顺序号 ,每一个结果集 都有自己顺序号 ,不能直接查询大于 1 的数。利用ROWNUM,我们可以生产一些原先难以实现的结果输出。 例如实现分页操作。
ps: oracle 中 索引从 1 开始,java 程序 从 0 开始
1、rowid
实现重复记录的删除
源码:
insert into tb_student values(1,‘张三’,‘语文’,81);
insert into tb_student values(2,‘张三’,‘数学’,75);
insert into tb_student values(3,‘李四’,‘语文’,86);
insert into tb_student values(4,‘李四’,‘数学’,90);
insert into tb_student values(5,‘王五’,‘语文’,81);
insert into tb_student values(6,‘王五’,‘数学’,100);
insert into tb_student values(7,‘王五’,‘英语’,90);
commit;
select * from tb_student;
–1.根据名字,课程,分数分组
select name,course,score from tb_student group by name,course,score;
–2.找到每个数据唯一的一条
–因为rowid是唯一的,所以找到rowid就可以了,但是找到的数据是经过去重的,是组函数,所以不能直接用rowid
select name,course,score,min(rowid) from tb_student group by name,course,score;
–3.找到要删除的重复的数据
select rowid
from tb_student
where not rowid in
(select min(rowid) from tb_student group by name, course, score);
–4. 最终 删除重复的数据
delete from tb_student where not rowid in
(select min(rowid) from tb_student group by name, course, score);
图片: