一条sql语句引发的遐想:select t.*, t.rowid from STUDENT t

       在学习oracle 过程当中,当在看tables时,比如STUDENT,右击——查看——查询,会自动有这样的一条查询语句:

select t.*, t.rowid from STUDENT_TJB t

       其中,作为一个sql小白,我想问的就是rowid是什么用法,还有t.*定位的什么表还是用户呢?

       经过查询资料,获得了几个重要的知识点:

 一、 ROWID(行ID)

      ROWID也是一种数据类型,但是这种数据类型是Oracle 服务器使用并管理的。它具有以下几个特性:

  •  ROWID是数据库每一行的唯一标识符。
  •  ROWID作为列值是隐式存储的。
  •  ROWID不直接给出行的物理地址,但是可以用ROWID来定位行。
  •  ROWID提供了最快速地访问表中行的方法。

查询以下STUDENT表中的ROWID: select rowid from STUDENT; 结果如下:

 

      可以看出, Oracle的物理扩展ROWID有18位。

      ROWID的每位采用64位编码,分别用A~Z、a~z、0~9、+、/共64个字符表示。其中,A表示0,B表示1,……Z表示25,

a表示26,……z表示51,0表示52,……,9表示61,+表示62,/表示63。

       例如,

create table test_rowid (id number, row_id rowid); --1.创建一临时表 
insert into test_rowid values(1,null); --2.插入一行记录 
update test_rowid set row_id = rowid where id = 1; --修改刚插入的记录 
select rowid,row_id from test_rowid; --4.查看rowid 

     返回结果为:
  

                  rowid                                 row_id 
            AAAO0DAAJAAAAMYAAA                    AAAO0DAAJAAAAMYAAA

 

       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开始计数)。

 二、select t.* ,rowid.t from 表 t

      1.

       select t.*   是选出t表的所有信息
       select *     是选出 关键字from后面的所有表的信息
       如果from 后面只有一个表,那么两者无区别。

      2.       

      当from后面只有一个表名时,select t.*,rowid 能用, select *,rowid为什么不能用?提示“未找到要求的FROM关键字”。

因为select *,rowid的时候,会把rowid当作表的一个字段来用,而在select t.*,rowid的时候没有作为所查表的字段。

    3. 

     比如select t.* from table t,那么t就是你查的那张表table的别名,后面写的时候,table可以用t代替,简单点,这里的t.*就是查询table表的所有列名,有多少,查出多少,*就是全部的意思、     

 

转载于:https://www.cnblogs.com/xiaoxiaoweng/p/7443484.html

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值