Oracle笔记之rowid 与 rownum

rowid与rownum

  • ROWID 是 ORACLE 中的一个重要的概念。用于定位数据 库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。 ROWID 它是一个伪列,它并不实际存在于表中。它是 ORACLE在读取表中数据行时,根据每一行数据的物理 地址信息编码而成的一个伪列。所以根据一行数据的 ROWID能找到一行数据的物理地址信息。从而快速地定 位到数据行。数据库的大多数操作都是通过ROWID 来完 成的,而且使用ROWID来进行单记录定位速度是最快的。我们可以将其用于删除重复数据。
  • ROWNUM 是一种伪列,它会根据返回记录生成一个序列 化的数字。排序后的结果集的顺序号,每一个结果集 都 有自己顺序号,不能直接查询大于 1 的数。利用 ROWNUM,我们可以生产一些原先难以实现的结果输 出。 例如实现分页操作。
  • ps: oracle 中 索引从 1 开始,java 程序 从 0 开始

1. rowid

实现重复记录的删除

--创建测试表
create table tb_student(
id number(4) ,
name varchar2(20),
course varchar2(20),
score number(5,2)
);
--插入数据
insert into tb_student values(1,'张三','语文',81);
insert into tb_student values(2,'张三','数学',75);
insert into tb_student values(3,'李四','语文',81);
insert into tb_student values(3,'李四','语文',81);
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(3,'李四','语文',81);
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(3,'李四','语文',81);
insert into tb_student values(6,'王五','数学',100);
insert into tb_student values(3,'李四','语文',81);
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(3,'李四','语文',81);
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(3,'李四','语文',81);
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;

要求:删除重复记录,一条记录只保留一次
思路 --> 将所有记录按照某种特定规律分组(相同的记录为一组),保留下每组中的一条记录即可,其他记录删除


--1、找出重复数据 :哪个学生 哪门课重复了
select name,course,count(1) from tb_student group by name,course; 
select name,course,count(1) from tb_student group by name,course having count(1)>1;
--2、删除重复数据 :删除重复记录
--每条记录的唯一标识
select s.*, rowid from tb_student s;
--找出保留的rowid
select min(rowid) from tb_student group by name,course;
--删除
delete from tb_student where rowid not in(select min(rowid) from tb_student group by
name,course);

2. rownum

rownum的作用:rownum是对结果集的编序排列,始终是从1开始,rownum只能用于<

--最底层 rownum 数据库默认顺序号 -->没有用的
select emp.*, rownum from emp;
select emp.*, rownum from emp order by sal;
--自己 排序后结果集的顺序号
select e.*, rownum from (select * from emp order by sal desc) e;
--取出工资前5名
select e.*, rownum 
 from (select * from emp order by sal desc) e
where rownum <= 5;
--取出 工资 3-5 名
select e.*, rownum
 from (select * from emp order by sal desc) e
where rownum <= 5 and rownum >= 3;
--三层模板 (分页)
select e.*
  from (select e.*, rownum rn
          from (select * from emp order by sal desc) e
          where rownum <= 5) e
 where rn >= 3;
/*
select 字段列表 from (select e.*,rownum rn from
(select from 表 order by 字段) e where rownum<=
最大值)
where rn>=最小值
*/
select e.*
  from (select e.*, rownum rn
          from (select * from emp order by sal desc) e
         where rownum <= 10) e
 where rn >= 6;
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA开发区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值