Oracle之表的管理

来源:互联网 发布:天天模拟器官网 mac版 编辑:程序博客网 时间:2024/04/29 21:50

3.1创建和管理表(重点)
 3.1.1常用的数据类型
  在Oracle中 之前使用的emp,dept,salgrade都是系统内建好的表,
  那么在SQL语法中同样支持了表的创建语句,要想创建表,则首先
  应该里哦阿杰一下Oracle中最常用的几种数据类型:
  
  name           数据类型                   描述
  1      VARCHAR,VARCHAR2     表示一个字符串,有长度限制255
 2           NUMBER(n),          表示一个整数长度为n,可以用INT
 2      NUMBER(n,m)      表示一个小数,整数为n小数为m 可以用FLOAT
 3           DATE                 表示日期的类型,要按标准格式储存
 4           CLOB                 大对象,表示大文本数据,一般可以存放4G的文本
 5           BLOB                 大对象,表示二进制数据,最大可以存放4G,
                  如电影,歌曲,图片
 
 3.1.2表的建立
 
    表的建立还是按照标准的语法进行,在表的建立时候会制定约束,
    那么先在此处给出一个表建立的简单语法
   
    CREATE TABLE 表名称(字段名称 字段类型 [DEFAULT 默认值]
               ......
               字段名称 字段类型 [DEFAULT 默认值])
 
 之前学习过复制表的语法
  CREATE TABLE 表名称 AS(子查询)
  1、如果现在子查询写的是:SELECT * FROM emp;表示的将表结构和雷同一起复制
  2、如果在子查询中写的是:SELECT * FROM emp WHERE 1=2;
  跟上的查询条件如果永不成立,那我们只复制表的结构而没有复制表的内容
  
  范例:创建一张person表,表中的字段类型如下所示:
  pid  VARCHAR2(18)   表示人员编号
  name VARCHAR2(200)  表示人员姓名
  age  NUMBER(3)     表示人员年龄
  birthday DATE       表示人员生日
  sex   VARCHAR2(2)   表示人员性别
  SQL如下:
  CREATE TABLE person(
    pid VARCHAR2(18),
    name VARCHAR2(200),
    age NUMBER(3),
    birthday DATE,
    sex VARCHAR2(2) DEFAULT '男'
  );
  
  INSERT INTO person VALUES('320882198711262832','张三',30,TO_DATE
  ('1987-11-26','yyyy-mm-dd'),'女');
  
  INSERT INTO person(pid,name,age,birthday)
  VALUES('320882198711262832','李四',30,TO_DATE
  ('1988-01-16','yyyy-mm-dd'));
  我们将以上SQL 称之为SQL脚本。
  
  第二次插入数据 由于没有插入性别会默认为'男'
  
  如果现在希望在表中增加一个address的字段,则可以将表先删除之后再重新创建
  
  3.1.3表的删除
  DROP TABLE person;
  
  CREATE TABLE person(
    pid VARCHAR2(18),
    name VARCHAR2(200),
    age NUMBER(3),
    birthday DATE,
    sex VARCHAR2(2) DEFAULT '男',
    address VARCHAR(200)
  );
  
  如果现在一个表中已经存在了大量的记录,在删除的话很麻烦,
  所以在SQL语法之中提供了专门修改表结构的命令:增加列,修改列
  
  3.1.4表的修改
  
  在SQL语法操作中,提供了ALTER指令,可以通过ALTER 来增加列
  在一般的数据库开发中,很少去修改表结构,DB2中就没有提供
  ALTER指令的语法如下:
  ALTER TABLE 表名称 ADD(列的名称 列的类型 **ULT 默认值)
  使用之前的TABLE person 修改如下:
  ALTER TABLE person ADD(address VARCHAR(200) DEFAULT '暂无地址');
 
 如果现在假设要修改person中的name 字段的值,将name的长度修改为50 ,
 默认值为"无名氏"
 
 修改表结构的语法:
 ALTER TABLE 表名称 MODIFY(列的名称 列的类型 **ULT 默认值)
 
 但是,在修改表结构的时候,如果假设数据库中对应的字段里有一个很长的数据,
 则无法将表的长度缩小,例如:现在在name字段中存在一个长度为20的字符的字母,
 原来的name可以容纳200个内容,但是此时要将name字段修改为10,则肯定无法实现
 
 范例:修改person表中的name 列,加入默认值,修改大小
 ALTER TABLE person MODIFY(name VARCHAR2(20) DEFAULT '无名氏');

 范例:再向表中插入数据,不插入姓名的内容
 INSERT INTO person(pid,age,birthday)
 VALUES('333333333333333333',30,TO_DATE
 ('1988-01-16','yyyy-mm-dd'));
 
  然后查询表数据
  SELECT * FROM person;
  我们可以发现 pid 是可以重复的不符合我们的要求是因为建表
  的时候我们没有对pid字段进行约束
  
  3.1.5为表重命名
  在Oracle中提供了RENAME指令,可以为表重命名;
  RENAME person TO tperson;
  
  3.1.6截断表
  之前我们知道:如果现在将person表中的一条数据使用DELETE语句删除了,
  则可以通过rollback进行回滚,但是现在假设要清空一张表的数据,
  但是同时又不需要回滚,可以立刻释放资源就需要使用截断表语法(Oracle中专用的)
  
  TRUNCATE TABLE 表名称
  范例:截断表 tperson表
  TRUNCATE TABLE tperson;
 
  完成此操作后,我们进行回滚操作 rollback;
 最后我们再查询tperson表数据 发现数据回滚不了了,已经被释放了
 
 
面试题
让你建一张表 national 表中只有一个name字段
请你 使用SQL语句实现下面的查询结果
 --------------
中国--->荷兰
中国--->巴西
中国--->美国
荷兰--->中国
荷兰--->巴西
荷兰--->美国
巴西--->中国
巴西--->荷兰
巴西--->美国
美国--->中国
美国--->荷兰
美国--->巴西
 
 CREATE TABLE national(
  name VARCHAR2(30)
 );
 INSERT INTO national VALUES ('中国');
 INSERT INTO national VALUES ('荷兰');
 INSERT INTO national VALUES ('巴西');
 INSERT INTO national VALUES ('美国');

SELECT t1.name||'--->'||t2.name
FROM national t1, national t2
WHERE t1.name!=t2.name;
 

原创粉丝点击