SQL中的数据定义功能包括模式定义、表定义、视图定义、索引的定义。下面对以上操作一一总结:
1、模式的定义与删除
“模式”是一个数据库的命名空间,一个框架,打个比方:在java中,创建模式相当于创建一个包,而创建表相当于创建一个类,一个类是在某一个包下面进行管理的。在mysql中,创建模式与创建数据库是一样的,也就是create schema <模式名>与 create database <数据库名>是等效的。所以模式的定义与删除语句如下:
create schema <模式名> authorization <用户名>,例如创建一个学生-课程的模式S-T
create schema "S-T" authorization wang;//为用户wang创建一个模式S-T
删除模式语句如下:
drop schema <模式名> <cascade|restrict>
其中cascade与restrict两者必选其一。
cascade(级联),表示删除模式的同时,把该模式中的所有数据库对象(例如表等)也全部删除。
restrict(限制),表示如果该模式下已经定义了下属的数据库对象(如表、视图等),则拒绝执行该删除语句的执行。
2、基本表的定义、删除与修改
表的定义基本格式如下:
create table<表名>(
<列名> <数据类型> [列级完整性约束条件],
<列名> <数据类型> [列级完整性约束条件],
<列名> <数据类型> [列级完整性约束条件]
);
例如创建学生的选课表:
create table SC(
Sno char(9),
Cno char(4),
Sname char(20) unique,//取唯一值
primary key(Sno,Cno),//主码由两个属性构成,须作为表级完整性进行定义
foreign key(Sno) references Student(Sno),//表级完整性约束,Sno是外码,被参照的表是Student
foreign key(Cno) references Course(Cno)//表级完整性约束,Cno是外码,被参照的表是Coruse
);
删除基本表的定义如下:
drop table<表名>[restrict|cascade];
如果选择restrict,则该表的删除是有限制条件的。待删除的基本表不能被其他的约束所引用(如check,foreign key等约束),不能有视图,不能有触发器(trigger),不能有存储过程或函数等。
如果是cascade,则该表的删除没有限制条件。在删除表的同时,相关的依赖对象,例如视图,也将一并删除。
修改基本表的一般格式如下:
alter table <表名>
[add <新列名> <数据类型> [完整性约束]]
[drop <完整性约束名>]
[alter column <列名> <数据类型>];
例如,向Student表中添加“入学时间”:
alter table Student add S_entrance Date;
将年龄的数据类型由字符型改为整型
alter table Student alter column Sage int;
增加课程名必须取唯一值的约束条件
alter table Course add unique (Cname);
3、索引的建立与删除
建立索引是为了加快查询速度,可以根据需要,在基本表上建立一个或多个索引,以提供多种存取路径,加快查找速度。
建立索引的语句定义如下:
create [unique][cluster] index <索引名> on <表名>(<列名>[<次序>][,<列名>[<次序>]]);
其中次序是指定索引值的排序次序,可以选择ASC(升序)或DESC(降序),缺省值是ASC。
unique表明此索引的每一个索引值只对应唯一的数据记录。
cluster表明要建立的索引是聚簇索引。聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织。例如:
create cluster index Stuname on Student(Sname);
该语句将会在Student表中的Sname列上建立一个聚簇索引,用户可以在最经常查询的列上建立聚簇索引以提高查询效率。在一个表上只能创建一个聚簇索引。如果对已经建立聚簇索引列上的数据进行更新操作时,常常导致表中记录的物理顺序发生改变,代价较大,所以对于经常更新的列不宜建立聚簇索引。
例如在SC表上创建一个索引,该索引是唯一的,且按学号升序和课程号降序,如下:
create unique index SCNO on SC(Sno ASC, Cno DESC);
索引的维护是由系统完成的,不用用户干预。建立索引是为了减少查询操作的时间,但如果数据增删改的操作比较频繁,系统则会话费很多时间来维护它,从而降低查询效率,这时可以删除一些不必要的索引,删除语句如下:
drop index <索引名> on <表名>或 alter table <表名> drop index <索引名>
具体索引的使用方法,可以参照该网站:http://www.jb51.net/Special/621.htm
在RDBMS中,索引一般采用B+树、HASH索引来实现。B+树具有动态平衡的优点。HASH具有查找快速的优点。至于索引的实现是采用B+树还是HASH索引,则由具体的RDBMS来决定。