5.2.1、创建和管理表(重点)
在Oracle中之前使用的emp、dept、salgrade都是系统内建好的表,那么在SQL语法中同样支持了表的创建语句,要想创建表,则首先应该了解一下Oracle中最常使用到的几种数据类型。
5.2.2、常用的数据类型(重点)
常用的数据类型,如之前的emp表中已经出现了三种:NUMBER、VARCHAR、DATE
No. | 数据类型 | 描述 |
1 | VARCHAR、VARCHAR2 | 表示的是一个字符串,有长度限制,为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/