二、SQL功能
以学生-课程数据库为例,定义一个学生-课程模式S-T。包括三个表:
- 学生表:Student(++Sno++,Sname,Ssex,Sage,Sdept)
- 课程表:Course(++Cno++,Cname,Cpno,Ccredit)
- 学生选课表:SC(++Sno,Cno++,Grade)
1.数据定义
- 模式的定义与删除
要创建模式,需有数据库管理员权限,或获得了数据库管理员授权的CREATE SCHEMA的权限。定义模式实际上定义了一个命名空间,在这个空间里可以进一步定义该模式包含的数据库对象,例如基本表、视图、索引等。
CREATE SCHEMA<模式名> AUTHORIZATION <用户名>;
/* 为用户WANG定义了一个学生-课程模式S-T */
CREATE SCHEMA"S-T" AUTHORIZATION WANG;
/* 若没有指定<模式名>,则<模式名>隐含为用户名WANG */
CREATE SCHEMA AUTHORIZATION WANG;
创建模式的同时可以在这个模式定义中进一步创建基本表、视图、定义授权。
CREATE SCHEMA<模式名> AUTHORIZATION <用户名> [<表定义子句>|<视图定义子句>|<授权定义子句>];
/* 为用户ZHANG创建一个模式TEST,并在其中定义一个表TAB1 */
CREATE SCHEMA TEST AUTHORIZATION ZHANG
CREATE TABLE TAB1(COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20)
);
删除模式,CASCADE(级联)和RESTRICT(限制)两者必选其一。选择CASCADE表示删除模式的同时把该模式中所有数据库对象全部删除;选择RESTRICT表示如果该模式中已经定义了下属的数据库对象,则拒绝该删除语句的执行。
DROP SCHEMA<模式名><CASCADE|RESTRICT>;
/* 删除模式ZHANG,同时,该模式中已经定义的表TAB1也被删除了 */
DROP SCHEMA ZHANG CASCADE;
- 基本表的定义、删除与修改
定义基本表 CREATE TABLE
CREATE TABLE<表名>(<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]
...
[,表级完整性约束条件]);
/* 建立一个“学生”表Student */
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY, /* 列级完整性约束条件,Sno是主码 */
Sname CHAR(20) UNIQUE, /* Sname取唯一值 */
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
/* 建立一个“课程”表Course */
CREATE TABLE Course
(Cno CHAR(4) PRIMARY KEY, /* 列级完整性约束条件,Cno是主码 */
Cname CHAR(40) NOT NULL, /* 列级完整性约束条件,Cname不能取空值 */
Cpno CHAR(4), /* Cpno表示先修课 */
Ccredit SMALLINT,
FOREIGN KEY(Cpno) REFERENCE Course(Cno)
/* 表级完整性约束条件,Cpno是外码,被参照表是Course,被参照列是Cno */
/* 本例用来说明参照表和被参照表可以是同一个表 */
);
/* 建立学生选课表SC */
CREATE TABLE SC
(Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno), /* 主码由两个属性构成,必须作为表级完整性进行定义 */
FOREIGN KEY(Sno) REFERENCE Student(Sno),
/* 表级完整性约束条件,Sno是外码,被参照表是Student */
FOREIGN KEY(Cno) REFERENCE Course(Cno)
/* 表级完整性约束条件,Cno是外码,被参照表是Course */
);
数据类型:在SQL中域的概念用数据类型来实现。定义表的各个属性时需要指明其数据类型及长度。
模式与表:每一个基本表都属于某一个模式,一个模式包含多个基本表。定义基本表时有三种方法定义它所属的模式。
/* 1.在表中明显地给出模式名 */
CREATE TABLE "S-T".Student(...);/* Student所属的模式是S-T */
/* 2.在创建模式语句中同时创建表 */
/* 为用户ZHANG创建一个模式TEST,并在其中定义一个表TAB1 */
CREATE SCHEMA TEST AUTHORIZATION ZHANG
CREATE TABLE TAB1(COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20)
);
/* 3.设置所属的模式,这样在创建表时表名中不必给出模式名,系统根据搜索路径确定模式 */
SHOW search_path; /* 显示当前搜索路径 */
/* 搜索路径默认为$user,PUBLIC,表示首先搜索与用户名相同的模式名,如果不存在,则使用PUBLIC模式 */
/* 数据库管理员可以设置搜索路径来建立S-T.Student基本表 */
SET search_path TO "S-T",PUBLIC; /* 设置搜索路径 */
CREATE TABLE Student(...); /* 定义基本表 */
修改基本表 ALTER TABLE
ALTER TABLE <表名>
[ADD [COLUMN] <新列名><数据类型> [完整性约束]]
[ADD<表级完整性约束>]
[DROP [COLUMN]<列名> [CASCADE|RESTRICT]]
[DROP CONSTRAINT<完整性约束名> [RESTRICT|CASCADE]]
[ALTER COLUMN <列名><数据类型>];
/* 向Student表增加“入学时间”列,其数据类型为日期型 */
ALTER TABLE Student ADD S_entrance DATE; /* 新增加的列一律为空值 */
/* 将年龄的数据类型改为整数 */
ALTER TABLE Student ALTER COLUMN Sage INT;
/* 增加课程名称必须取唯一值的约束条件 */
ALTER TABLE Course ADD UNIQUE(Cname);
删除基本表 DROP TABLE
DROP TABLE <表名> [RESTRICT|CASCADE];
/* 删除Student表 */
DROP TABLE Student CASCADE;
CASCADE(级联)和RESTRICT(限制),前者删除时,相关依赖对象如视图都将被一起删除,后者若存在依赖该表的对象则基本表不能被删除。
- 索引的创建与删除
建立索引 CREATE INDEX
CREATE [UNIQUE] [CLUSTER] INDEX<索引名>
ON <表名>(<列名>[次序][,<列名>[<次序>]]...);
/* Student表按学号升序建立唯一索引 */
CREATE UNIQUE INDEX Stusno ON Student(Sno);
/* Course表按课程号升序建立唯一索引 */
CREATE UNIQUE INDEX Coucno ON Course(Cno);
/* SC表按学号升序、课程号降序建立唯一索引 */
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
次序可选 ASC-升序(默认) DESC-降序,UNIQUE表明此索引的每一个索引值只对应唯一的数据记录,CLUSTER表示要建立的索引是聚簇索引。
修改索引
ALTER INDEX <旧索引名> RENAME TO <新索引名>;
/* 将SC表的SCno索引名改为SCSno */
ALTER INDEX SCno RENAME TO SCSno;
删除索引
DROP INDEX <索引名>;
/* 删除Student表的Stusname索引 */
DROP INDEX Stusname;