• 一条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表的所有列名,有多少,查出多少,*就是全部的意思、     

  • 相关阅读:
    [Writeup]奇怪的单点音
    [Writeup]百度一下,你就知道
    C语言学习一个月后感想
    小黄衫获得感想及经验总结
    Ubuntu初始化配置
    在Ubuntu 18.04中安装 docker compose
    Docker安装 配置
    Laravel Heroku评价
    Laravel Deploy to Heroku
    Laravel Nuxt auth refresh
  • 原文地址:https://www.cnblogs.com/xiaoxiaoweng/p/7443484.html
Copyright © 2020-2023  润新知