1.4 DDL语句

DDL是“数据定义语言”(Data Defination Language)的缩写,它包含CREATE、ALTER、DROP、RENAME、TRUNCATE等命令,用来对数据库对象进行创建、修改、删除、重命名等操作。其中CREATE、ALTER和DROP命令的功能十分强大,几乎可以对所有的数据库对象进行管理,例如表、视图、索引、存储程序等。在本节中仅介绍与表的操作有关的DDL命令,与其他数据库对象有关的DDL命令在以后的章节中将陆续介绍。

1.4.1 表的创建

CREATE命令可用来创建表。创建表时要确定表的结构,即确定表中各列的名字和类型。在关系数据库中,表被看做是一个关系,表中的每个列是关系中的属性,是一个不可再分割的基本单位。表中的行对应关系中的一个元组。表的结构确定下来以后,就可以通过INSERT语句向表中插入数据了。用来创建表的CREATE命令格式为:


CREATE TABLE表名(

列1数据类型,

列2数据类型,

……

);


如果已经存在同名的表,则应该先删除原来的表,然后再创建。表名是代表这个数据库对象的名称,对表名的要求是必须以字母开头,长度为1~30个字符,而且只能包含A~Z、a~z、0~9、_、$和#等字符,不能使用Oracle的保留字,在同一个用户模式中不能拥有两个同名的表。

表中的每个列都有一个名字,在同一个表中不能有同名的列。列的数据类型可以是系统预定义的类型,也可以是用户自定义类型。表1.7列出了系统预定义的数据类型。

在创建表时,可以通过DEFAULT关键字为列指定一个默认值,这样当用INSERT语句插入一行时,如果没有为该列指定值,就以默认值填充,而不是插入空值。

figure_0039_0010

例如,创建一个学生表,表中包括学号、姓名、性别、出生日期、所在学校等列,可以用下列的CREATE语句:


SQL>CREATE TABLE student(

sno number(8),

sname char(8),

birthday date,

school varchar(40));


如果要验证表的结构是否与期望的结果一致,可以在表创建之后通过DESC命令查看表的结构。这个命令只能列出表中各列的列名、数据类型以及是否为空等属性。

在创建表时,还可以以另一个表为模板确定当前表的结构。一般情况下,可以从一个表复制它的结构,从而快速创建一个表。复制表的结构是通过子查询来实现的,即在CREATE语句中可以嵌套SELECT语句。这时的CREATE语句格式为:


CREATE TABLE表名

AS SELECT语句


CREATE语句将根据SELECT子句中指定的列,确定当前表的结构,然后将子查询返回的数据插入到当前表中,这样在创建表的同时向表中插入了若干行。例如,现在要根据表emp的结构创建表emp_1,仅复制表emp中的empno、deptno和sal三个列,同时复制部门30的数据。相应的CREATE语句为:


SQL>CREATE TABLE emp_1

AS SELECT empno, deptno, sal

FROM emp

WHERE deptno=30;


一般情况下,在通过这种方式创建的表中,列名和列的定义与原来的表一致。如果希望在创建一个新表时指定与原来的表不同的列名,可以在CREATE语句中的表名之后指定新的列名。如果只希望拷贝表的结构,而不复制表中的数据,可以将SELECT子句中的条件指定为一个永远为假的条件。例如,现在希望根据表emp创建表emp_2,为复制的三个列指定新的列名,并且不复制表emp中的数据,相应的CREATE语句为:


SQL>CREATE TABLE emp_2(empno_2,deptno_2,sal_2)

AS SELECT empno, deptno, sal

FROM emp

WHERE 1<0;


实际上,创建表的语句是非常复杂的,在表上可以定义约束,可以指定存储参数等属性。

在这里,顺便向读者介绍两个概念,一个是模式(Schema),一个是数据字典(Data dictionary)。模式指的是一个用户所拥有的所有数据库对象的逻辑集合。在创建一个新用户时,同时创建了一个同名的模式,这个用户创建的所有数据库对象都位于这个模式中。用户在自己的模式中创建表,需要具有CREATE TABLE系统权限,如果需要在别人的模式中创建表,则需要具有CREATE ANY TABLE权限。在访问其他用户的数据库对象时,要指定对方的模式名称,例如,通过SCOTT.EMP引用SCOTT用户的emp表。

数据字典是一些视图,从这些视图中可以查看一些重要的系统系统数据,如数据库中的表、索引、权限、表空间等信息。这些视图是在创建数据库时自动创建的,它们的内容也是由数据库服务器自动维护的。用户可以查看以下几种形式的数据字典视图:

·以USER_开始的视图;

·以ALL_开始的视图;

·以DBA_开始的视图。

从USER视图中可以查看当前用户所创建的某类数据库对象,如在USER_TABLES中可以查看当前用户所创建的任何一个表的信息。从ALL视图中可以查看当前用户有权限访问的某类数据库对象,如在ALLTABLES中可以查看当前用户有权限的任何一个表的信息。在DBA视图中可以查看当前数据库中所有的某类对象的信息,如在DBATABLES中可以查看当前数据库中所有的表。DBA视图只能由数据库管理员(一般是SYS用户)查看。