`

Oralce中ROWNUM、ROWID的使用

阅读更多

一.ROWNUM的使用——TOP-N分析

        使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM。

        ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说ROWNUM是符合条件结果的序列号。它总是从1开始排起的。

        使用ROWNUM时,只能使用<、<=、!=符号。举例:student(学生)表,表结构为:

ID       char(6)      --学号
name    VARCHAR2(10)   --姓名

        初始化数据:

--建表
create table student(ID char(6), name VARCHAR2(10));
--添加测试记录
insert into studentvalues('200001','张一');
insert into studentvalues('200002','王二');
insert into studentvalues('200003','李三');
insert into studentvalues('200004','赵四');
commit;

        测试:

--测试
SQL> select * fromstudent;

        运行结果:

ID     NAME
------------------------------
200001 张一
200002 王二
200003 李三
200004 赵四

1.rownum对于等于某值的查询条件

        如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。

selectrownum,id,name from student where rownum=1;

        运行结果:

    ROWNUM ID     NAME
---------- ---------------------------------------------------------
         1 200001 张一
selectrownum,id,name from student where rownum =2;

        运行结果:

未选定行

 

2.rownum对于大于某值的查询条件

        如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录。

select rownum,id,name from student where rownum >2;

        运行结果:

未选定行

        那如何才能找到第二行以后的记录呢?可以使用子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。

select *from(select rownum no ,id,name from student) where no>2;

        运行结果:

        NO ID     NAME
---------- ---------------------------------------------------------
         3 200003 李三
         4 200004 赵四
select *from(select rownum,id,name from student)where rownum>2;

        运行结果:

未选定行

 

3.rownum对于小于某值的查询条件

        如果想找到第三条记录以前的记录,当使用rownum<3是能得到两条记录的。显然rownum对于rownum<n(n>1的自然数)的条件认为是成立的,所以可以找到记录。

selectrownum,id,name from student where rownum <3;

        运行结果:

    ROWNUM ID     NAME
-------------------------- ---------------------------------------------------
1 200001 张一
2 200002 王二

        综上几种情况,可能有时候需要查询rownum在某区间的数据,可以看出rownum对小于某值的查询条件是为true的,rownum对于大于某值的查询条件直接认为是false的,但是可以间接的让它转为认为是true的。那就必须使用子查询。例如要查询rownum在第二行到第三行之间的数据,包括第二行和第三行数据,那么我们可以写以下语句,先让它返回小于等于3的记录行,然后在主查询中判断新的rownum的别名列大于等于2的记录行。但是这样的操作会在大数据集中影响速度。

select * from(select rownum no,id,name from student where rownum<=3 ) where no >=2;

        运行结果:

        NO ID     NAME
---------- ------ ---------------------------------------------------
         2 200002 王二
         3 200003 李三

 

4.rownum和排序

        Oracle中的rownum是在取数据的时候产生的序号,所以想对指定排序的数据指定rowmun行数据就必须注意了。

select rownum,id,name from student order by name;

        运行结果:

    ROWNUM ID     NAME
---------- ---------------------------------------------------------
         3 200003 李三
         2 200002 王二
         1 200001 张一
         4 200004 赵四

        可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询。

select rownum,id,name from (select * from student order by name);

        运行结果:

    ROWNUM ID     NAME
---------- ---------------------------------------------------------
         1 200003 李三
         2 200002 王二
         3 200001 张一
         4 200004 赵四

        这样就成了按name排序,并且用rownum标出正确序号(由小到大)。order by name 如果name是主键或有索引,查询出来的rownum完全按照1,2,3.....的次序。

alter tablestudent add constraint pk_stu primary key(name);

select rownum,id,name from student order by name;

        运行结果:

ROWNUM ID NAME
---------- ---------------------------------------------------------
1 200003 李三
2 200002 王二
3 200001 张一
4 200004 赵四

 

二.ROWID的使用——快速删除重复的记录

        ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置。

        ROWID可以分为物理rowid和逻辑rowid两种。普通的表中的rowid是物理rowid,索引组织表(IOT)的rowid是逻辑rowid。

        当表中有大量重复数据时,可以使用ROWID快速删除重复的记录。

        举例:

--建表tbl
create table stu(no number,name varchar2(10),sexchar(2));
--添加测试记录
insert into stu values(1, 'ab',’男’);
insert into stu values(1, 'bb',’女’);
insert into stu values(1, 'ab',’男’);
insert into stu values(1, 'ab',’男’);
commit;

        删除重复记录方法很多,列出两种。

1.通过创建临时表

        可以把数据先导入到一个临时表中,然后删除原表的数据,再把数据导回原表,SQL语句如下:

create table stu_tmpas select distinct* from stu;
truncate tablesut;                                                  //清空表记录
insert into stuselect * from stu_tmp;                       //将临时表中的数据添加回原表

        这种方法可以实现需求,但是很明显,对于一个千万级记录的表,这种方法很慢,在生产系统中,这会给系统带来很大的开销,不可行。

 

2.利用rowid结合max或min函数

        使用rowid快速唯一确定重复行结合max或min函数来实现删除重复行。

delete from stua where rowid not in (select max(b.rowid) from stu b where a.no=b.no and a.name= b.name and a.sex = b.sex);                                          //这里max使用min也可以

        或者用下面的语句

delete from stua where rowid < (select max(b.rowid) from stu b where a.no=b.no and a.name =b.name and a.sex = b.sex);       //这里如果把max换成min的话,前面的where子句中需要把"<"改为">"

        跟上面的方法思路基本是一样的,不过使用了group by,减少了显性的比较条件,提高效率。

delete from stuwhere rowid not in (select max(rowid) from stu t group by t.no, t.name, t.sex);

 

思考:若在stu表中唯一确定任意一行数据(1,'ab',’男’),把sex字段更新为”女”,怎么做?

update stu set sex=’女’where rowid=(select min(rowid) from stu where no=1 and name=’ab’ and sex=’男’);

 

文章来源:http://blog.csdn.net/heqiyu34/article/details/6773689

分享到:
评论

相关推荐

    在oracle中灵活使用Rownum和rowId

    举例介绍在oracle中rownum和rowId的不同以及使用方法

    oracle_SQL中rowid与rownum的使用

    oracle_SQL中rowid与rownum的使用

    Oracle学习笔记(rownum和rowid)

    Oracle学习笔记(rownum和rowid),有具体的代码案例讲解rownum和rowid

    oracle_SQL中ROWID与ROWNUM的使用

    oracle_SQL中ROWID与ROWNUM的使用 很有用哦

    rowid与rownum的使用

    oracle 数据库 rowid与rownum的使用

    对于 Oracle 的 rownum 问题

    另外:rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的,rowid 可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。rowid 相对于表来说又像表中的...

    oracle_SQL-rowid--rownum.zip_oracle

    oracle_SQL中 rowid 和rownum的使用

    oracle rowid

    oracle rowid rownum 等组成原理

    rowid与rownum区别

    ORACLE 中ROWNUM用法总结!数据库管理员及程序开发员必看。

    Oracle查询语句中rownum与rowid的不同之处分析

    本文主要是以实例形式介绍了Oracle查询中rownum与rowid的不同之处,以及以假设的方式为例,查询条件为rownum = 2,在查询出第一条记录时的具体内容的介绍。 在查询中,我们可以注意到,类似于 select xx from ...

    Oracle DBA性能优化实践

    Hint.pdf Oracle中rowid与rownum的使用.pdf Oracle优化 之 索引.pdf Oracle优化器.pdf STATSPACK详解.pdf 学用ORACLE_AWR和ASH特性.pdf 执行计划.pdf

    oracle面试题

    掌握Oracle中rowid,rownum的使用,掌握ORACLE分页语句的写法,掌握ORACLE存储过程的创建和使用,

    Oracle数据库学习指南

    Oracle2: 1. 《Oracle8 优化技术》摘录 (第一章 安装) 2. 《Oracle8 优化技术》摘录 (第二章 ...50. 怎样在SQLPlus中使用 '&' 来实现自定义参数变量? 51. 怎样在查询记录时给记录加锁 52. 自动备份Oracle数据库

    Oracle高级sql学习与练习

    12、ROWID的使用 13、ORACLE 10G正则表达式 14、使用HINT 15、PARITION分区 16、并行操作 17、扩展DDL和DML语句 18、MODEL语句 19、10G闪回查询 20、专题-行列转换 21、专题-连续值和累计值问题 22、专题-NULL和DUAL...

    oracle数据库伪列简单介绍

    oracle数据库伪列的介绍,让你明白rownum和rowid的一些区别。

    Oracle课件.pdf

    2. Oracle中的伪列 2.1 ROWID 2.2 ROWNUM 3. Oracle单行函数 3.1字符函数 3.2数字函数 3.3日期函数 3.4转换函数 3.5其他常用函数 4. Oracle分析函数 4.1 分析函数介绍 4.2 分析函数种类和用法 4.3 行列...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...

    Oracle练习.txt

    5.如何在ORACLE中取毫秒? select systimestamp from dual; 6.如何在字符串里加回车? 添加一个||chr(10) select 'Welcome to visit'||chr(10)||'www.CSDN.NET' from dual ; 7.怎样修改oracel数据库的默认日期? ...

Global site tag (gtag.js) - Google Analytics