15、表的管理

5.2.1、创建和管理表(重点

       Oracle中之前使用的empdeptsalgrade都是系统内建好的表,那么在SQL语法中同样支持了表的创建语句,要想创建表,则首先应该了解一下Oracle中最常使用到的几种数据类型。

 

5.2.2、常用的数据类型(重点

       常用的数据类型,如之前的emp表中已经出现了三种:NUMBERVARCHARDATE

No.

数据类型

描述

1

VARCHARVARCHAR2

表示的是一个字符串,有长度限制,为255

2

NUMBER

NUMBER(n):表示一个整数,数字的长度是n,可以使用INT代替

NUMBER(m,n):表示一个小数,数字小数长度为n,整数长度为m-n,可以使用FLOAT代替

3

DATE

表示日期的类型,日期要按照标准的日期格式进行存放

4

CLOB

大对象,表示大文本数据,一般可以存放4G的文本

5

BLOB

大对象,表示二进制数据,最大可以存放4G,例如:存放电影、歌曲、图片

 

5.2.3、表的建立(重点

       表的建立还是按照标准的语法进行,但是在表的建立时有时候会指定约束,那么此处先给出一个表建立的一个简单语法。

表的建立语法:

CREATE TABLE 表名称(

       字段名称1     字段类型       [DEFAULT 默认值],

       字段名称2     字段类型       [DEFAULT 默认值],

       ...

       字段名称n     字段类型       [DEFAULT 默认值],

)

       之前学习过复制表的语法:

CREATE TABLE 表名称 AS(子查询)

       ·如果现在子查询写的是:SELECT * FROM emp,表示将表结构和表内容一起复制

       ·如果现在子查询写的是:SELECT * FROM emp WHERE 1=2,加入了一个永远不可能成立的条件,则表示的是只复制表结构,但是不复制表内容

范例:复制表结构

CREATE TABLE temp AS(SELECT * FROM emp WHERE 1=2);

       现在,假设要创建一张person表,表中的字段类型及如下所示:

No.

字段名称

字段类型

描述

1

pid

VARCHAR2(18)

表示人员的编号

2

name

VARCHAR2(200)

表示人员的姓名

3

age

NUMBER(3)

表示人员的年龄

4

birthday

DATE

表示人员的生日

5

sex

VARCHAR2(2)

表示人员的性别,默认值是“男”

范例:创建表

CREATE TABLE person(

       pid     VARCHAR2(18),

       name         VARCHAR2(200),

       age    NUMBER(3),

       birthday  DATE,

       sex    VARCHAR2(2) DEFAULT ''

);

范例:向表中增加数据

INSERT INTO person(pid,name,age,birthday,sex) VALUES

('1111','张三',33,TO_DATE('1976-02-13','yyyy-mm-dd'),'');

INSERT INTO person(pid,name,age,birthday) VALUES

('2222','李四',34,TO_DATE('1975-02-13','yyyy-mm-dd'));

       如果现在希望在表中增加一个address的字段,则可以将表先删除之后再重新创建。

 

5.2.4、表的删除(重点

       表的删除语法如下:   

DROP TABLE 表名称;

范例:删除person

DROP TABLE person;

重新编写新的脚本

CREATE TABLE person(

       pid     VARCHAR2(18),

       name         VARCHAR2(200),

       age    NUMBER(3),

       birthday  DATE,

       sex    VARCHAR2(2) DEFAULT '',

       address   VARCHAR2(200)

);

       如果现在假设一个表中已经存在了大量的记录,再删除的话,是不是很麻烦,所以在SQL语法之中提供了专门修改表结构的命令:增加列、修改列

 

5.2.5、表的修改(了解

       SQL语法操作中,提供了ALTER指令,通过ALTER指令就可以增加新的列。

范例:为最早的person表中增加一个address

DROP TABLE person;

CREATE TABLE person(

       pid     VARCHAR2(18),

       name         VARCHAR2(200),

       age    NUMBER(3),

       birthday  DATE,

       sex    VARCHAR2(2) DEFAULT ''

);

INSERT INTO person(pid,name,age,birthday,sex) VALUES

('1111','张三',33,TO_DATE('1976-02-13','yyyy-mm-dd'),'');

INSERT INTO person(pid,name,age,birthday) VALUES

('2222','李四',34,TO_DATE('1975-02-13','yyyy-mm-dd'));

ALTER指令的语法如下:

ALTER TABLE 表名称 ADD(列的名称 列的类型 DEFAULT 默认值,列的名称 列的类型 DEFAULT 默认值,…)

范例:person表中增加address

ALTER TABLE person ADD (address VARCHAR2(200) DEFAULT '暂无地址');

       如果现在假设要修改person中的name字段的值,将name的长度修改为50,默认值为“无名氏”。

修改表结构的语法:

ALTER TABLE 表名称 MODIFY(列的名称 列的类型 DEFAULT 默认值)

 

       ·但是,在修改表结构的时候,如果假设数据库中对应的字段里有一个很长的数据,则无法将表的长度缩小,例如:现在在name字段中存在一个长度为20个字符的字母,原本的name可以容纳200个内容,但是此时要将name字段的长度修改为10,则肯定无法实现。

范例:修改person表中的name列,加入默认值,修改大小

ALTER TABLE person MODIFY(name VARCHAR2(50) DEFAULT '无名氏');

范例:再向表中插入数据,但是不插入姓名的内容

INSERT INTO person(pid,age,birthday) VALUES

('333333333333333333',32,TO_DATE('1977-02-13','yyyy-mm-dd'));

       以上插入内容的时候,没有插入姓名

       在一般的数据库程序开发中,很少去修改表结构,这一点在IBM DB2数据库中就没有提供ALTER TABLE指令,所以在建表的时候一定要考虑到位。

       从以上的操作结果中可以发现,身份证编号重复了,这是因为表中没有增加约束的原因。

 

5.2.6、为表重命名(了解

       Oracle中提供了RENAME命令,可以为表重新进行命名,但是此语句只能在Oracle中使用。

语法格式:

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

范例:person表重新命名为tperson

RENAME person TO tperson;

 

5.2.7、截断表(了解

       之前讲解过,如果现在将person表中的一条数据使用DELETE语句删除了,则可以通过rollback进行回滚,如果现在假设要想清空一张表的数据,但是同时又不需要回滚,可以立刻释放资源就需要使用截断表的语法:

TRUNCATE TABLE 表名称;

范例:截断tperson

TRUNCATE TABLE tperson;

5.2.8、思考题

       现在有一张国家表,里面只有一个国家名称的字段,内容如下:“中国、美国、巴西、荷兰”,现在要求通过查询实现对战功能:

       ·中国 → 美国

    ·中国 → 巴西

    ·中国 → 荷兰

    ·美国→ 中国

    ·美国→ 巴国

    ·美国→ 荷兰

        …

    问:此程序该如何实现?

分析:本程序只能使用笛卡尔积完成

CREATE TABLE national(

       name VARCHAR2(30)

);

--增加测试数据

INSERT INTO national(name) VALUES('中国');

INSERT INTO national(name) VALUES('美国');

INSERT INTO national(name) VALUES('巴西');

INSERT INTO national(name) VALUES('荷兰');

    ·查询的时候肯定是表自己关联自己

SELECT t1.name,t2.name

FROM national t1,national t2

WHERE t1.name<>t2.name;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21817401/viewspace-621955/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21817401/viewspace-621955/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值