4.4 数据定义语言(DDL)
SQL的数据定义语言可以创建、修改或删除数据库中各种对象,包括表、视图、索引。视图是基于基表的虚表,索引是依附于基表的,因此SQL通常不提供修改视图定义或修改索引定义的操作。用户如果需要修改视图或索引定义,只能先把它们删除,然后再重建。本节先介绍对基表和索引的数据定义语言,因为对于视图的定义需要使用查询语言,所以会在介绍查询语言之后再介绍对视图的操作。
4.4.1 新建、删除与修改表
1.建表
新建表的命令为CREATE TABLE语句,其语法格式如下:
CREATE TABLE <表名>(<列名><数据类型>[限制条件] [,<列名><数据类型>[限制条件]]…);
其中“[]”中为可选的内容,<表名>是要定义的表的名字,一个表可以由一个或多个属性(列)组成,在列名的后面要注明改属性的数据类型。
建表的同时可以定义与该表有关的完整性约束条件,例如不能为空等。
简单来说,创建新表格时,在关键词CREATE TABLE后面加入所要建立的表格的名称,然后在括号内顺次设定各列的名称,数据类型,以及可选的限制条件等。
★ 注意 ★
所有的SQL语句在结尾处都要使用“ ;”符号。
使用SQL语句创建的数据库表格和表格中列的名称必须以字母开头,后面可以使用字母、数字或下画线,名称的长度不能超过30个字符。下面举例说明。
假设学校需要建立“学生”表,它由学号、姓名、性别、年龄、家庭住址五个属性组成。其中学号为主键所以不能为空,且值不能重复。SQL语句如下:
CREATE TABLE STUDENTS( SNO CHAR(6) NOT NULL UNIQUE, SNAME CHAR(8) NOT NULL, AGE SMALLINT, SEX CHAR(1), ADDRESS CHAR(20));
★ 注意 ★
用户在选择表格名称时不要使用SQL语言中的保留关键词,如select, create, insert等,作为表格或列的名称。
2.修改基表
在实际应用中,有时需要修改已经建立好的基表,SQL语言中使用ALTER TABLE语句修改表,可以进行两种修改:增加列以及修改原有列的定义。增加列的语法如下所示:
ALTER TABLE <表名> ADD(<列名><数据类型>[限制条件]…);
例如要在上述的STUDENTS表中加入联系电话属性,SQL语句如下:
ALTER TABLE STUDENTS ADD TELENUM CHAR(8);
★ 说明 ★
不论基表中原来是否已有数据,新增加的列一律为空值。
修改原有列的定义的语法如下:
ALTER TABLE <表名> MODIFY(<列名>[<数据类型>]…);
例如要把STUDENTS表中的地址(ADDRESS)的数据类型改为长度为30的字符串,SQL语句如下:
ALTER TABLE STUDENTS MODIFY ADDRESS CHAR(30);
★ 注意 ★
如果列中已经存在数据,则不能改变数据类型,且不能缩短列的宽度,但可以增大列宽。
3.删除基表
当某个基表不再需要时,可以使用SQL的DROP TABLE语句删除。其语法如下:
DROP TABLE <表名>;
例如要把STUDENTS表删除,SQL语句如下:
DROP TABLE STUDENTS;
★ 注意 ★
删除基表后,与之相关的索引、视图随之消失,有的DBMS要求在DROP TABLE之前,先清空表中所有的数据行。
4.4.2 新建和取消视图
视图(view)是一种虚表,是逻辑表,不是物理存在的。视图可以从现有的一个或多个表中提取出来的,还可以屏蔽表中的某些信息;视图在数据库中是作为查询来保存的,当引用一个查询时,DBMS就执行这个查询,然后将查询结果作为视图来用。一个基表可以建立多个视图,一个视图也可以在几张表上建立。视图拥有表的几乎所有操作。使用视图有利于应用程序的独立性、数据的一致性、有利于数据库的安全性并且简化了查询。
建立视图
SQL语言中使用CREATE VIEW命令建立视图,其语法格式如下:
CREATE VIEW <视图名>[(<列名1>[,<列名2>,…])] AS <查询子句>;
4.4.3 新建和删除索引
在SQL中,索引的建立和删除也是DDL的一部分,但是严格地说,索引是物理存取路径,不属于逻辑数据模式。一般来说,建立与删除索引是DBA或建表的人负责完成的。系统在存取数据时会自动选择合适的索引作为存取路径,用户不能选择索引。
1.建立索引
SQL语言中使用CREATE INDEX命令建立视图,其语法格式如下:
CREATE [UNIQUE] INDEX <索引名> ON <表名>(<列名1>[ASC | DESC],<列名2>[ASC | DESC],…);
其中<表名>是要建立索引的基表,可以在一个或多个列上建立索引。如果列名后面加ASC,表示索引属性按升序排列;如果后面加DESC,则按降序排列。UNIQUE是可选项,如果加了UNIQUE,则每个索引属性值只能对应一个元组。
例如要给表STUDENTS按年龄升序建立索引,SQL语句如下:
CREATE INDEX AGE-INDEX ON STUDENTS (AGE ASC);
2.删除索引
建立索引是为了减少查询操作的时间,但如果数据增加删改频繁,系统会花费较多的时间来维护索引。这就需要删除索引。
删除索引使用DROP INDEX语句,其语法格式如下:
DROP INDEX <索引名>;