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;

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

  • 相关阅读:
    JSP动作元素<jsp:include>和<jsp:param>的搭配使用
    js去除字符串中的空格
    js 判断字符串中是否包含某个字符串(转载)
    window+R
    eclipse中ctrl+K失效
    图片转二进制——各种方法汇总(转载)
    spring mvc使用ModelAndView时发生No request handling method with name '方法 名' in class [类名]的错误
    类中main函数的快捷创建
    java中的中文字符转码技术
    SPOJ QTREE6
  • 原文地址:https://www.cnblogs.com/lc1776/p/9156252.html
Copyright © 2011-2022 走看看