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;