zoukankan      html  css  js  c++  java
  • Oracle笔记(九) 表的创建及管理

    对于数据库而言实际上每一张表都表示的是一个数据库的对象,而数据库对象指的就是DDL定义的所有操作,例如:表、视图、索引、序列、约束等等,都属于对象的操作,所以表的建立就是对象的建立,而对象的操作主要分为以下三类语法:

    • 创建对象:CREATE 对象名称 …;
    • 删除对象:DROP 对象名称 …;
    • 修改对象:ALTER 对象名称 …;

    一、常用的数据字段

    每一张数据表实际上都是由若干个字段所组成,而每一个字段都会有其对应的数据类型,而在Oracle之中,常用的数据类型有如下几种:

    数据类型

    关键字

    描述

    1

    字符串

    VARCHAR2(n)

    其中n表示的是字符串所能保存的最大长度,基本上保存200个左右的内容

    2

    整数

    NUMBER(n)

    表示最多为n位的整数,有时候也可以使用INT代替

    3

    小数

    NUMBER(n,m)

    其中m为小数位,n-m为整数位,有时候也可以使用FLOAT代替

    4

    日期

    DATE

    存放日期-时间

    5

    大文本

    CLOB

    可以存储海量文字(4G),例如存储《三国演艺》、《红楼梦》

    6

    大对象

    BLOB

    存放二进制数据,例如:电影、MP3、图片、文字

    一般在开发之中使用最多的:VARCHAR2()、NUMBER、DATE、CLOB,而对于BLOB字段一般使用较少,首先BLOB可以存放4G的二进制数据,但是存放进去之后,一是数据库过于庞大,二是读取不方便;

    二、表的创建

    如果现在要想进行表的创建,可以使用如下的操作语法:

    复制代码
    CREATE TABLE 表名称 (
        字段1 数据类型 [DEFAULT默认值],
        字段2 数据类型 [DEFAULT默认值],
        … …,
        字段n 数据类型 [DEFAULT默认值]
    );
    复制代码

    下面创建一张成员表(member),有如下保存的信息:姓名、年龄、生日、个人简介。

    复制代码
    CREATE TABLE member (
         name VARCHAR2(50) DEFAULT '无名氏',
         age NUMBER(3),
         birthday DATE DEFAULT SYSDATE,
         content CLOB
    );
    复制代码

    表创建成功之后,下面开始向表中增加数据:

    INSERT INTO member(name,age,birthday,content) VALUES('张三',20,TO_DATE('1990-08-12','yyyy-mm-dd'),'一个好人');
    INSERT INTO member(age,content) VALUES(20,'一个好人');

    一定要再次记住,表的创建是属于数据库对象的创建,所以使用的是CREATE语法。

    三、表的复制

    在之前学习过表的复制操作,下面给出其完整的操作语法:

    CREATE TABLE 复制表名称 AS 子查询;

    范例:复制一张只包含20部门雇员信息的表

    CREATE TABLE emp20 AS SELECT * FROM emp WHERE deptno=20;

    范例:现在要求将emp表的表结构复制出来,不要数据 —— 写一个永远满足不了的条件即可。

    CREATE TABLE empnull AS SELECT * FROM emp WHERE 1=2;

    但是以上的语法只是Oracle数据库所支持的操作,其他的数据库语法上会有一些区别。

    四、为表重命名

    在Oracle数据库之中,所有的数据实际上都是通过数据字典保存的,例如,在之前曾经使用过如下的一种查询:

    SELECT * FROM tab;

    以上就是一个数据字典,而在Oracle之中,提供了三种类型的数据字典,最常用的是:dba_、user_,所以下面查询一个user_tables数据字典:

    SELECT * FROM user_tables;

    也就是说Oracle中的所有数据都是按照文件保存的,那么所有的内容都会在数据字典中注册,既然这样,所谓的修改表名称实际上对于Oracle而言就相当于修改一条数据而已,而修改表名称的方法如下:

    RENAME 旧的表名称 TO 新的表名称;

    范例:将member表更名为person表

    RENAME member TO person;

    但是这种操作由于是Oracle数据库所独有的一种特性,所以了解即可,不用做深入的掌握。

    五、截断表

    在之前曾经讲解过一个删除表数据的操作,使用的是DELETE操作,但是这种删除操作本身有一个特点,即:可以进行事务的回滚,也就是说删除之后并不会立刻释放数据的资源,如果现在希望彻底释放掉一张表所占用的全部资源(表空间、索引等等)就可以使用截断表的语法,此语法如下:

    TRUNCATE TABLE 表名称;

    范例:截断person表

    TRUNCATE TABLE person;

    但是这种语法本身只是Oracle所有的,所以只做了解即可。

    六、表的删除

    表的删除操作指的是数据库对象的删除,既然是删除则使用DROP语句,删除表的语法如下:

    DROP TABLE 表名称;

    范例:删除person表

    DROP TABLE person;

    七、Oracle 10g的新特性:闪回技术

    在Oracle 10g之后,为了预防用户的误删除表操作,专门提供了回收站的功能,用户所删除的表默认情况下会在一个回收站之中保存,而用户也可以通过回收站,进行表的恢复,所以此技术称为闪回(FLASHBACK);

    范例:查看回收站

    SHOW RECYCLEBIN;

    这个时候可以发现所有已经删除的表都在回收站之中保存,那么下面就可以使用如下的语法恢复表:

    FLASHBACK TABLE 表名称 TO BEFORE DROP;

    范例:恢复myemp表

    FLASHBACK TABLE myemp TO BEFORE DROP;

    当然,现在也可以直接删除掉回收站中的一些数据表,语法如下:

    PURGE TABLE 表名称;

    范例:删除回收站中的person表

    PURGE TABLE person;

    范例:清空回收站

    PURGE RECYCLEBIN;

    如果现在希望删除一张表,而又不希望其进入到回收站之中,则可以在删除的时候增加PURGE。

    DROP TABLE myemp PURGE;

    这种技术是在Oracle 10g之后才有的,而Oracle 11g也是存在的。

    问题:现在在回收站之中存在了一张tab表,而后又建立了一张tab表,那么如果从回收站中恢复的话,可以吗?

    答:无法恢复。

    八、修改表结构

    如果一张建立好的数据表,发现其初期的结构已经不满足于后期的使用要求,则可以进行表的修改操作,而表的修改操作实际上就是数据库对象的修改操作,使用ALTER指令完成,例如,现在有如下一张表:

    CREATE TABLE member (
         mid NUMBER,
         name VARCHAR2(50)
    );

    现在希望可以向表中增加字段,所以此时可以采用如下的语法完成:

    ALTER TABLE 表名称 ADD(列名称 数据类型 [DEFAULT 默认值],
      列名称 数据类型 [DEFAULT 默认值],…);

    范例:为member表增加字段

    ALTER TABLE member ADD(age NUMBER(3), birthday DATE DEFAULT SYSDATE);

    如果增加的数据列没有默认值,则所有已有的数据的列的内容都是null,而如果增加的列指定了DEFAULT默认值的话,则所有已有的数据列都是设置的默认值。

    现在也可以修改已有的表结构,此时的语法如下:

    ALTER TABLE 表名称 MODIFY(列名称 数据类型 [DEFAULT 默认值],
      列名称 数据类型 [DEFAULT 默认值],…);

    范例:将name字段的默认值定义为无名氏

    ALTER TABLE member MODIFY(name VARCHAR2(100) DEFAULT '无名氏');

    虽然在SQL语法之中以及Oracle数据库之中,都给出了修改表结构的操作,但是这种操作能不使用就不使用,从大型数据库来讲,世界上性能最高的数据库是IBM DB2,但是IBM DB2本身有一个平台的限制问题,所以如果说是跨平台的数据库则是Oracle数据库的性能最高。

    在IBM DB2数据库之中是不允许修改表结构的,即:表建立完成之后就不能修改了,所以以后在开发之中也尽可能的不要去修改表结构。

    九、思考题

    现在要求建立一张nation表,表中有一个name字段,里面保存四条记录:中国、美国、巴西、荷兰,要求通过查询实现如下的操作效果:

    中国         美国

    中国         巴西

    中国         荷兰

    美国         巴西

    美国         中国

    美国         荷兰

    剩下的依次类推,现在要求建立新的表并完成此查询的操作。

    本题目的主要目的并不是在于查询的编写上,而是在于规范化数据库创建脚本的格式,以后只要是碰到了类似的要求,首先必须编写一个数据库创建脚本,这个脚本的要求如下:

    1、  本文件的文件名称后缀必须是“*.sql”;

    2、  先删除相应的数据表;

    3、  编写创建表的语句;

    4、  增加测试数据;

    5、  提交事务;

    复制代码
    --1、删除表
    DROP TABLE nation PURGE;
    --2、创建表
    CREATE TABLE nation(
        name VARCHAR2(50)
    );
    --3、测试数据
    INSERT INTO nation(name) VALUES('中国');
    INSERT INTO nation(name) VALUES('美国');
    INSERT INTO nation(name) VALUES('巴西');
    INSERT INTO nation(name) VALUES('荷兰');
    --4、事务提交
    COMMIT;
    复制代码

    本程序如果要想完成依靠笛卡尔积完成,属于表的自身关联。

    SELECT n1.name,n2.name
    FROM nation n1,nation n2
    WHERE n1.name<>n2.name;

    而且以后如果面试之中,出现了一些复杂的查询,建议把脚本写全了。

  • 相关阅读:
    广域网(ppp协议、HDLC协议)
    0120. Triangle (M)
    0589. N-ary Tree Preorder Traversal (E)
    0377. Combination Sum IV (M)
    1074. Number of Submatrices That Sum to Target (H)
    1209. Remove All Adjacent Duplicates in String II (M)
    0509. Fibonacci Number (E)
    0086. Partition List (M)
    0667. Beautiful Arrangement II (M)
    1302. Deepest Leaves Sum (M)
  • 原文地址:https://www.cnblogs.com/MonkTang/p/9204843.html
Copyright © 2011-2022 走看看