精华内容
下载资源
问答
  • 《一》rowid和rownum的区别rowid是一条记录的物理地址,rownum是查询结果集的序号rowid是不会变的,rownum对于不同条件查询时是可以变化的《二》oracle rowid 的使用方法1.创建一临时表create table test_rowid (id ...

    《一》rowid和rownum的区别

    rowid是一条记录的物理地址,rownum是查询结果集的序号

    rowid是不会变的,rownum对于不同条件查询时是可以变化的

    《二》oracle rowid 的使用方法

    1.创建一临时表

    create table test_rowid (id number, row_id rowid);

    2.插入一行记录

    insert into test_rowid values(1,null);

    3.修改刚插入的记录

    update test_rowid set row_id = rowid where id = 1;

    4.查看rowid

    select rowid,row_id from test_rowid;

    返回结果为:

    rowid row_id

    AAAO0DAAJAAAAMYAAA AAAO0DAAJAAAAMYAAA

    Oracle的物理扩展ROWID有18位,每位采用64位编码,分别用A~Z、a~z、0~9、+、/共64个字符表示。A表示0,B表示1,……Z表示25,a表示26,……z表示51,0表示52,……,9表示61,+表示62,/表示63。

    ROWID具体划分可以分为4部分。

    (1).OOOOOO:前6位表示DATA OBJECT NUMBER,将起转化位数字后匹配DBA_OBJECTS中的DATA_OBJECT_ID,可以确定表信息。

    如上面例子中的DATA OBJECT NUMBER是AAAO0D,转化位数字是14×64×64 +52×64 + 3。

    输入以下查询:

    select owner, object_name from dba_objects where data_object_id = 14*64*64 + 52*64 + 3;

    返回:

    OWNER OBJECT_NAME

    WG TEST_ROWID

    (2)FFF:第7到9位表示相对表空间的数据文件号。

    上面的例子中是AAJ,表示数据文件9。

    输入以下查询:

    (3).BBBBBB:第10到15位表示这条记录在数据文件中的第几个BLOCK中。

    上面的例子是AAAAMY,转化位数字是12×64+24,表示这条记录在数据文件中的第792个BLOCK。

    (4).RRR:最后3位表示这条记录是BLOCK中的第几条记录。

    上面的例子是AAA,表示第0条记录(总是从0开始计数)。

    展开全文
  • Rownum 和 Rowid是Oracle数据库所特有的,通过他们可以查询到指定行数范围内的数据记录。 以下通过例子讲解: -- 为了方便,首先,查找dept表中的所有。 select deptno,dname,loc from scott.dept; -- ...

    Rownum RowidOracle数据库所特有的,通过他们可以查询到指定行数范围内的数据记录。

     

    以下通过例子讲解:

    -- 为了方便,首先,查找dept表中的所有。

    select deptno,dname,loc from scott.dept;

     

     

    -- Rownum

    -- 可以查询 rownum(行数) 为 1 的数据

    select rownum,deptno,dname,loc

    from scott.dept

    where rownum = 1;

     

     

    -- 如果直接查询 rownum 为 2 的数据,返回是 null

    -- 因为 rownum 是临时产生的一个“伪列”

    -- 是先获取到全部的数据之后,才决定如何分配 rownum

    -- 需要先搞定 1,才能知道下一个是 2,即需要从1开始查起。

     

    -- 查询最前面两条的记录

    select rownum,deptno,dname,loc

    from scott.dept

    where rownum < 3;

    -- 会从1开始查起,查到后接着查询2...直到不符合条件。

     

     

     

    -- 下面查询结果为 null,因为1没有查,接下来的无从查起。

    select rownum,deptno,dname,loc

    from scott.dept

    where rownum > 3;

     

    -- 1开始查起,直到全部。

    select rownum,deptno,dname,loc

    from scott.dept

    where rownum > 0;

     

    -- Rowid是一串随机生成的字符串,也是 Oracle 提供的一个数列。

    -- Rownum 和 Romid 区别

    -- 一般情况下,每一行数据对应一个 rowid,这个值是固定而且唯一的。

    -- 在这行数据存入数据库的时候,就确定的了,自动生成的。

    -- 相当于我们 Java 对象在堆内存中对应有一个固定的地址值。

    -- 可以使用 rowid 来查询记录,通过它可以提高我们的查询速度

    -- 因为会有一张表单独保存 rowid,如果在查询的时候,

    -- 需要扫描的列越少,速度就会越快,也是 oracle 查询最快的方式之一

    -- rowid 在你的表发生移动时候,也会跟着一起发生改变。

    -- 最大的一个作用:因为是唯一的,可以用来避免重复数据。

    select rowid, deptno, dname, loc

    from scott.dept

    where rowid = 'AAAR3qAAEAAAACHAAC';

    转载于:https://www.cnblogs.com/yifeiyaoshangtian/p/9440760.html

    展开全文
  • (一)rownum的概念 ROWNUM是一个序列,会根据sql语句自动给你加上一列排好顺序的序号列。rownum总是为满足条件的记录从1开始设...例如找10名以后同学的成绩:当从数据库中找到语文成绩第一名的记录时,设序号为1,该

    (一)rownum的概念

    ROWNUM是一个序列,会根据sql语句自动给你加上一列排好顺序的序号列。rownum总是为满足条件的记录从1开始设序号,所以rownum总是从1开始的。rownum是根据sql查询出的结果给每行分配一个逻辑编号。

    从定义可以理解,rownum只能使用小于等于号。不能使用大于号。

    例如找10名以后同学的成绩:当从数据库中找到语文成绩第一名的记录时,设序号为1,该记录不满足rownum>10。所以抛弃该记录,接着从数据库中找到语文成绩第二名的记录,又设序号为1,该记录依然不满足rownum>10,依次类推。所以穷尽整张表抛弃了所有记录。

    (二)rownum的用法

    对于范围查询可以使用子查询来解决rownum的局限性。需要注意的是:子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。 

    实例:求薪水最高的第六个人到第十个人

    第一种查询语句:(用时:秒级别 ,2秒多)

    select  ename,sal from 

      (select ename,sal,rownum r from 

           (select ename,sal from emp order by sal desc)

       ) t  where t.r  between 6  and 10; (这种分页语句查询效率比较低)


    第二种分页查询语句:(用时:毫秒级别,几毫秒)推荐使用这种。

    1. SELECT * FROM     
    2. (    
    3. SELECT A.*, ROWNUM RN     
    4. FROM (SELECT * FROM T1) A     
    5. WHERE ROWNUM <= 40    
    6. )    
    7. WHERE RN >= 21;  

    对于效率的比较可以参考:点击打开链接


    (二)ROWID的用法(用于删除重复的记录)

    DELETE FROM hr.employees t1
    WHERE t1.ROWID NOT IN (
                           SELECT MIN(t2.ROWID)
                           FROM hr.employees t2
                           GROUP BY t2.employee_id --按照想要唯一保留的字段进行分组
                          );

      这个明显就比方法一好多了,子查询中我们先选除了rowid,然后按照我们想要保留的唯一字段进行分组,并取每组最小的rowid(注意是子查询表的rowid);然后在用not in删除除开最小的rowid以外的所有记录


    参考文档:https://www.cnblogs.com/zhongjiajie/p/5652376.html


    (三)多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join. 

    Hash join的工作方式是将一个表(通常是小一点的那个表)做hash运算,将列数据存储到hash列表中,从另一个表中抽取记录,做hash运算,到hash 列表中找到相应的值,做匹配。


    Nested loops 工作方式是从一张表中读取数据,访问另一张表(通常是索引)来做匹配,nested loops适用的场合是当一个关联表比较小的时候,效率会更高。


    Merge Join 是先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配,因为merge join需要做更多的排序,所以消耗的资源更多。 通常来讲,能够使用merge join的地方,hash join都可以发挥更好的性能。

    展开全文
  • select c.* from( select a.*,rownum rm from oper_log a) c where c.rm between 1 and 10 注意:rownum是伪列,意思就是数据库中并不存在的列,它是只有在显示了第一行时才给出一个值 1,下一行则在上一行的值上加1...

    先给出一个分页的例子: 查出从第一到第十行记录!

    select c.* from( select a.*,rownum rm  from oper_log a) c where c.rm between 1 and 10

    注意:rownum是伪列,意思就是数据库中并不存在的列,它是只有在显示了第一行时才给出一个值 1,下一行则在上一行的值上加1,所以如果rownum>2 则不会有任何匹配的记录。由于rownum>2不匹配第一行记录,所以第一行不显示,记录跳到第二行,第二行又会被rownum重新写上值 1,这样第二行又匹配。以此类推造成每行记录输出的rownum值永远停在1上,并由于条件rownum>2造成所有行都不被显示。下面有详细解释。如果你想分页就必需将伪列转化为实际列,即将有伪列的查询做为子查询处理。

    以下是解释:

    对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<、<=、!=),并非说用>,>=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇,同样是伪列,rownum 与 rowid 可有些不一样,下面以例子说明

    假设某个表 t1(c1) 有 20 条记录

    如果用 select rownum,c1 from t1 where rownum < 10, 只要是用小于号,查出来的结果很容易地与一般理解在概念上能达成一致,应该不会有任何疑问的。

    可如果用 select rownum,c1 from t1 where rownum > 10 (如果写下这样的查询语句,这时候在您的头脑中应该是想得到表中后面10条记录),你就会发现,显示出来的结果要让您失望了,也许您还会怀疑是不谁删了一些记录,然后查看记录数,仍然是 20 条啊?那问题是出在哪呢?

    先好好理解 rownum 的意义吧。因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。所以您没办法期望得到下面的结果集:

    11 aaaaaaaa
    12 bbbbbbb
    13 ccccccc
    .................

    rownum >10 没有记录,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录。或者可以这样理解:

    ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。

    有了以上从不同方面建立起来的对 rownum 的概念,那我们可以来认识使用 rownum 的几种现像

    1. select rownum,c1 from t1 where rownum != 10 为何是返回前9条数据呢?它与 select rownum,c1 from tablename where rownum < 10 返回的结果集是一样的呢?
    因为是在查询到结果集后,显示完第 9 条记录后,之后的记录也都是 != 10,或者 >=10,所以只显示前面9条记录。也可以这样理解,rownum 为9后的记录的 rownum为10,因条件为 !=10,所以去掉,其后记录补上,rownum又是10,也去掉,如果下去也就只会显示前面9条记录了

    2. 为什么 rownum >1 时查不到一条记录,而 rownum >0 或 rownum >=1 却总显示所以的记录
    因为 rownum 是在查询到的结果集后加上去的,它总是从1开始

    3. 为什么 between 1 and 10 或者 between 0 and 10 能查到结果,而用 between 2 and 10 却得不到结果
    原因同上一样,因为 rownum 总是从 1 开始

    从上可以看出,任何时候想把 rownum = 1 这条记录抛弃是不对的,它在结果集中是不可或缺的,少了rownum=1 就像空中楼阁一般不能存在,所以你的 rownum 条件要包含到 1

    但如果就是想要用 rownum > 10 这种条件的话话就要用嵌套语句,把 rownum 先生成,然后对他进行查询。
    select *
    from (selet rownum as rn,t1.* from a where ...)
    where rn >10

    一般代码中对结果集进行分页就是这么干的。

    另外:rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的,rowid 可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。rowid 相对于表来说又像表中的一般列,所以以 rowid 为条件就不会有 rownum那些情况发生。
    另外还要注意:rownum不能以任何基表的名称作为前缀。

    本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-07/66121.htm


    展开全文
  • 不同的数据库不连续的取数据的语法是不同的:oracle: select * from (select t.*,rownum num from T_XT_ZZJG t where t.rownumVALUE2; select * from T_XT_ZZJG a where a.rowid in (select b.ridfrom (select...
  • Oracle数据库

    2019-04-01 22:00:58
    1,ROWID用法ROWID是数据的详细地址,通过rowid,oralce可以快速的定位某行具体的数据的位置。 例:select a.*,rowid from 表名 a where 列名=‘值’ 2,ROWNUM的用法:ROWNUM表示查询某条记录在整个结果集中的...
  • rowid与rownum区别

    2018-05-22 16:24:16
    ORACLE 中ROWNUM用法总结!数据库管理员及程序开发员必看。
  • rownum,rowid都叫伪列。...若数据库文件没有移动,则每行的rowid一般是固定不变的。 racle中rownum用法的总结 对于Oracle的rownum问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(&l...
  • 数据库基础

    2012-09-22 16:27:04
    第八章 一些高级的用法 188 §8.1 关于DECODE 188 §8.1.1 DECODE 中的if-then-else逻辑 188 §8.1.2 DECODE 的简单例子 188 §8.1.3 DECODE实现表的转置 189 §8.2 关于访问远程数据库 192 §8.2.1 数据库链接 192 ...
  • Oracle数据库学习指南

    2012-07-04 22:12:40
    41. 什么是ROWID,为什么需要它 42. 手工安装数据库时需要安装那些系统包 43. 手工创建数据库的全部脚本及说明 44. 提高Oracle数据库应用系统安全的举例与分析 45. 在ORACLE7数据库并发控制技术的研究及其应用 ...
  • android sqlite数据库使用

    热门讨论 2011-09-17 00:25:56
     public static final String KEY_ROWID = "_id";  public static final String KEY_ISBN = "isbn";  public static final String KEY_TITLE = "title";  public static final String KEY_PUBLISHER = ...
  • rownum,rowid都叫伪列。 但是,rownum是逻辑上的编号,且其值总是从1开始,每行的rounum不是固定...若数据库文件没有移动,则每行的 rowid一般是固定不变的。 racle中rownum用法的总结 对于Oracle的 rownum 问题...
  • rownum,rowid都叫伪列。...若数据库文件没有移动,则每行的rowid一般是固定不变的。 oracle中rownum用法的总结 对于Oracle的rownum问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<、&...
  • 一、 Oracle中 rownum与rowid的理解 ...若数据库文件没有移动,则每行的 rowid一般是固定不变的。   racle中rownum用法的总结 对于 Oracle 的 rownum 问题,很多资料都说不支持&gt;,&gt...
  • 一、 oracle中 rownum与rowid的理解 rownum,rowid都叫伪列...若数据库文件没有移动,则每行的 rowid一般是固定不变的。   racle中rownum用法的总结 对于 Oracle 的 rownum 问题,很多资料都说不支持&gt...
  • 对这个rowid字段的用法不太理解,问大神:rowid就是伪列,相当于标识这条记录的一个ID。 注意:建议不太会的小白先备份一份表,再操作。 --------快速备份语句----- create table table1 as select * from table2 ; ...
  • 第一章Oracle数据库基础............................................................................................................23 §1.1 理解关系数据库系统(RDBMS).....................................
  • Oracle8i_9i数据库基础

    2010-03-03 14:16:58
    第八章 一些高级的用法 188 §8.1 关于DECODE 188 §8.1.1 DECODE 中的if-then-else逻辑 188 §8.1.2 DECODE 的简单例子 188 §8.1.3 DECODE实现表的转置 189 §8.2 关于访问远程数据库 192 §8.2.1 数据库链接 192 ...
  • MySQL hint用法解析

    2017-11-23 14:28:57
    我们可以对MySQL的对象(表、索引、触发器、自建函数、存储过程等)做注释(comment)...3) 表的访问路径,是全表扫描,还是索引扫描,还是直接利用rowid。 4) 表之间的连接类型 5) 表之间的连接顺序 6) 语句的并行程度
  • 5.9.1 Oracle的ROWID数据库限制 289 5.9.2 BigFile表空间的ROWID 290 5.9.3 使用dbms_rowid包获得ROWID的详细信息 290 5.10 使用OMF管理数据文件 291 第6章 自动存储管理(ASM) 294 6.1 ASM的历史 294 ...
  • 12.8 ROWID/UROWID类型 497 12.9 小结 497 第13章 分区 499 13.1 分区概述 499 13.1.1 提高可用性 500 13.1.2 减少管理负担 502 13.1.3 改善语句性能 505 13.2 表分区机制 507 13.2.1 区间分区 508 13.2.2 ...
  • 12.8 ROWID/UROWID类型 559 12.9 小结 560 第13章 分区 561 13.1 分区概述 561 13.1.1 提高可用性 562 13.1.2 减少管理负担 564 13.1.3 改善语句性能 569 13.2 表分区机制 571 13.2.1 区间分区 571 13.2.2 ...
  • 12.8 ROWID/UROWID类型 559 12.9 小结 560 第13章 分区 561 13.1 分区概述 561 13.1.1 提高可用性 562 13.1.2 减少管理负担 564 13.1.3 改善语句性能 569 13.2 表分区机制 571 13.2.1 区间分区 571 13.2.2 ...
  • Oracle心得1

    2007-11-05 22:55:00
    Oracle心得1 ROWID与ROWNUM的用法 ROWID伪列表示Oracle数据库中的一个行地址,其数据同其在内存中的存储地址相关。ROWID的主要作用是标识表中的每一行数据,这就相当于是数据库默认为每张表创建的一个标识列,但是...
  • **对于sqlite,如果使用“无rowid”创建表,则可能遇到与上述MySQL和Maria相同的问题 安装 npm install sql-fixtures 简单的例子 var sqlFixtures = require ( 'sql-fixtures' ) ; // depending on which database...
  • 11 管理表 目标 11-2 储存用户数据 11-3 Oracle 数据类型 11-5 ROWID 格式 11-8 行的结构 11-10 创建一张表 11-11 创建临时表 11-13 创建表:指南 11-14 修改储存参数 11-15 手工分配片 11-16 重构非分区表 11-17 ...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

数据库rowid用法