oracle 表(上)

来源:互联网 发布:a卡 mac dsdt10.13 编辑:程序博客网 时间:2024/06/13 22:57

  

  对于我们初学者来说,对表的概念也有一定的认识。因为我们对数据库的操作,90%以上是对表的操作。

 

常见表的类型:

 

 

  规则表(Regular table),严格意义上来说又叫heap table(堆表),也就是我们最普通的一张表。

  partition talbeIndex-organized table、Cluster 三种表类型,在讲解数据结构的时候有做过简单的描述,这里就不介绍,本节的重点也就是讲解普通的表。

 


 

  对于一张普通的表,他的插入规则是无序,我们把数据的存储空间看成学生宿舍楼一个连一个的房间。并不是第一个来的人就一定先在第一个房间。先来的人只要发现某个房间还有床位是空的就可以入住。

  那么我们如何让他变成的有序的呢?那么我可以专业创建一列来记录顺序。宿管在一楼门口发号码,进来一同学,发一个号码,上面标注几号房间几号床位。这样所有入住的同学都是有序的。

SQL> create table t  2  (a int,  3  b varchar2(4000) default rpad('*',4000,'*'),  4  c varchar2(3000) default rpad('*',3000,'*'));    //创建一个表Table created.SQL> insert into t(a) values(1);1 row created.SQL> insert into t(a) values(2);1 row created.SQL> insert into t(a) values(3);   //插入若干条记录1 row created..........SQL> select a from t;         A----------         3         1         4         5         2//上面查询插入的结果是无序的,如何变成的有序的呢? 加上 order by SQL> select a from t order by a;         A----------         1         2         3         4         5

  我们可以在表中添加一列用来记录行号,每添加一条数据自动加1。这样就有效保证插入有数据是有序列的。

 

 

表的字段类型划分                                           

 

oracle表类型结构图:

 

  Oracle数据类型分用户自定义类型(user-defined)和内嵌类型(built-in,但我们大多时候都用内嵌类型,在极特别情况下才会用到自定义类型。

  内嵌类型可以用为三大类,scalar翻译成标量,可以理解成单一的数据类型,collection 收集,这里可以理解为复合的类型,relationship 关系类型,类似于指针引用。而我们一般最常用的也就是scalar数据类型。

Scalar又可以分为四类:

字符串型char(n)nchar(n)varchar2(n)nvarchar2(n)、、

数值型number(p,s)

日期型datatimestamp

二进制类型raw(n)blogclobnclobbfilelonglong raw

记录编号rowidurowid

 

 

CHAR & VARCHAR2类型存储比较                          

 

  char(n) n=1 to 2000字节 定长字符串,n字节长,如果不指定长度,缺省为1个字节长(一个汉字为2字节)。 

  varchar2(n) n=1 to 4000字节 可变长的字符串,具体定义时指最大长度n,这种数据类型可以放数字、字母以及ASCII码字符集(或者EBCDIC等数据库系统接受的字符集标准)中的所有符号。如果数据长度没有达到最大值n,Oracle 8i/9i/10g会根据数据大小自动调节字段长度,如果你的数据前后有空格,Oracle 8i会自动将其删去。VARCHAR2是最常用的数据类型。

 

Varchar2 相比于char 在大数据的存储中就有效果的节约了很多空间。

Nchar、Nvarchar2分别是 char 与varchar2的国际版。

 

 

Rowid 字段类型                                                                     

 

Rowid 是一行数据的一个唯一标识。

下面来做个例子,来帮助我们认识它:

SQL> sreate table f(id int,name char(10));    //创建一个表Table created.SQL> insert into f values(0,'boobooke');    //插入几条相同人数据1 row created.SQL> select * from f;    //查看表内容        ID NAME---------- --------------------         0 boobooke         0 boobooke         0 boobookeSQL> select rowid,id,name from f;    //查看rowid隐藏列ROWID                      ID         NAME------------------ ---------- -----------------------------------------AAAMiXAABAAAOjKAAA          0    boobookeAAAMiXAABAAAOjKAAB          0    boobookeAAAMiXAABAAAOjKAAC          0    boobooke

 

  Rowid是一个隐藏的字段,每一张表都存在,默认查看一张数据的时候不会出现。只有特意加上rowid字段才会出现。

 

Rowid的结构:

需要声明一下的是,现在的格式是9i 及以后版本的格式。

6位(OOOOOO)为数据对象ID,一张表、一个所引都是一个数据对象,oracle都会分配给他们一个唯一的数据对象。

紧跟的3位(FFF)为相对的文件ID,我们知道表空间是由不同的文件组成,对象存储的某个文件里,每个文件会对应一个ID

再接着的6位(BBBBBB)为块ID ,文件是由块组成的,每个块也有一个唯一的ID编号。

最后3位(RRR)为行ID ,每个块又可划分成行,每个行也有一个ID号。

 

 

其他类型介绍                                        

 

1  number(m,n) m=1 to 38,n=-84 to 127 可变长的数值列,允许0、正值及负值,m是所有有效数字的位数,n是小数点以后的位数。如:number(5,2),则这个字段的最大值是99999,如果数值超出了位数 限制就会被截取多余的位数。如:number(5,2),但在一行数据中的这个字段输入575.316,则真正保存到字段中的数值是575.32。如:number(3,0),输入575.316,真正保存的数据是575。  

 

2  date 无 从公元前4712年1月1日到公元4712年12月31日的所有合法日期,Oracle 8i/9i/10g其实在内部是按7个字节来保存日期数据,在定义中还包括小时、分、秒。缺省格式为DD-MON-YY,如07-11月-00 表示  2000年11月7日。  

 

3  Long:可变长字符列,最大长度限制是2GB,用于不需要作字符串搜索的长串数据,如果要进行字符搜索就要用varchar2类型。

    long是一种较老的数据类型,将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。  

 

4  raw(n) n=1 to 2000 可变长二进制数据,在具体定义字段的时候必须指明最大长度n,Oracle 8/9i用这种格式来保存较小的图形文件或带格式的文本文件,如Miceosoft Word文档, 以及音频、视频等非文本文件。

    raw是一种较老的数据类型,将来会逐渐被BLOB、NCLOB等大的对象数据类型所取代。  

 

5  long raw 可变长二进制数据,最大长度是2GB。Oracle 8i/9i用这种格式来保存较大的图形文件或带格式的文本文件,如Miceosoft Word文档,以及音频、视频等非文本文件。

    在同一张表中不能同时有long类型和long raw类型,long raw也是一种较老的数据类型,将来会逐渐被BLOB、NCLOB等大的对象数据类型所取代。  

 

6  blob clob nclob

三种大型对象(LOB),用来保存较大的图形文件或带格式的文本文件,如Miceosoft Word文档,以及音频、视频等非文本文件,最大长度是4GB。LOB有几种类型,取决于你使用的字段的类型,Oracle 9i/10g实实在在地将这些数据存储在数据库内部保存。可以执行读取、存储、写入等特殊操作。  

 

7  bfile 无 在数据库外部保存的大型二进制对象文件,最大长度是4GB。这种外部的LOB类型,通过数据库记录变化情况,但是数据的具体保存是在数据库外部进行的。Oracle 8i/9i/10g可以读取、查询BFILE,但是不能写入。大小由操作系统决定。

 

8  LONG型:此数据类型用来存储可变长度的字符数据,最多能存储2GB。但是有一些限制:一个表中只有一列可以为LONG型,LONG列不能定义为主键或唯一约束,不能建立索引,过程或存储过程不能接受LONG数据类型的参数。

 

9  LOB数据类型

● LOB又称为“大对象”数据类型:主要有CLOB,BLOB(NBLOB),BFILE,三种子类型。

● CLOB代表(CHARACTER LOB),它能够存储大量字符数据,可以存储非结构化的XML文档。

● BLOB代表(BINARY LOB),它可以存储较大的二进制对象;如图形,音视频剪辑。

 

 

关于表的一些信息                                  

  

  Oracle规定一张表最多可以有1000列,但一般在我们设计表的时候根本不需这么多列,如果你真这么干了,很有可能你的设计不合理,要么就是极其特别的情况下需要这么做。对一个表的列数设计的越少,oracle 对表的操作性能越高。如果表的列数超过254列的时候,oracle在存放的时候分多个行片(row pieces),当你在读的时候,oracle将这些生片重新组装产生一个完整的列。

  Oracle对一张表存储的行数没有限制,理论上是无限的。但我们会受到其它的限制,如磁盘空间、内存等。例如,一个表这空间最多可以包含1022个文件(当然,oracle10g中有一个BIGFILE 表空间使文件的数量大大增加,超过了1022的限制)假设你的每个文件是32GB,那一个表空间可以放32*1022=32704GB ,这将是2143289344个数据块,假设第个块16KB,一个块可以放160条记录,一行80100个字节,那么一个表空间可存放342926295040行数据。Oracle还提供了分区表的功能,一个表可以拆分成1024个分区表,那么最大值是1024*342926295040行数据。这只是个理论最大值。

  索引是依附于表的,索引就是把不同列组合起来。在一张表中创建所引的个数理论上是无限的。

  那么一个数据库可以放多少张表?这个理论上也是无限,但一个数据库中不可能有上百万张表,这样对于创建与维护几乎是不可能的。但对于大型数据库来说有几千张表是完全可能。

一列数据在数据块中的存储:

 

Row header :存储一行中有多少行的信息,链接信息和 行锁的信息。

Column length : 用来存储列的长度。

Column value : 用来存储列的值。

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 信用卡要到期了怎么办 歌华有线怎么办停机 银行卡吐不出来怎么办 遂宁银行办信用卡怎么办 中国银行u盾冻结怎么办 京东账号被拉黑怎么办 自己配电脑系统怎么办 没有京东白条怎么办 还款银行卡丢了怎么办 注销不符合条件房地产怎么办 淘宝买东西买完就降价怎么办 闲鱼收到空包怎么办 咸鱼上没收到货怎么办 沙发颜色错了怎么办 运动鞋网面发黄怎么办 京东不让退货怎么办 第一次送美团又不会怎么办 退货把货寄错了怎么办 冰箱发动机没坏不制冷怎么办 冰箱发动机坏了怎么办 冰箱侧面有坑怎么办 冰箱门上有坑怎么办 冰箱面板磕了怎么办 信用卡寄错地址怎么办 利润低税负低怎么办 公司利润太高怎么办 狗老咬自己的脚怎么办 qq支付忘记密码怎么办 社保存钱晚了怎么办 购机发票丢了怎么办 快递已发货拒收怎么办 买家硬是不退款怎么办 余额宝利息下降怎么办 建行卡没激活怎么办 怎么办长沙银行的卡 淘宝入不了群怎么办 咸鱼上联系不上卖家怎么办 闲鱼联系不上卖家怎么办 卖家想退款要回车辆怎么办 卖家还没发货想退款怎么办 海尔冰箱无发票怎么办