数据库系统-数据定义
SQL的数据定义功能:定义各种数据库的“对象”
- 模式定义
 - 表定义
 - 视图定义
 - 索引定义
 
SQL的数据定义语句
| 操作对象 | 创建 | 删除 | 修改 | 
|---|---|---|---|
| 模式 | CREATE SCHEMA | DROP SCHEMA | |
| 表 | CREATE TABLE | DROP TABLE | ALTER TABLE | 
| 视图 | CREATE VIEW | DROP VIEW | |
| 索引 | CREATE INDEX | DROP INDEX | ALTER INDEX | 
各种数据库“对象”
现代关系数据库管理相同提供了一个层次化的数据库对象命名机制
- 一个数据库中可以建立多个模式
 - 一个模式下通常包括多个表、视图和索引等数据库对象
 

数据字典
数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有对象的定义信息以及一些统计信息:
- 关系模式、表、视图、索引的定义
 - 完整性约束的定义
 - 各类用户对数据库的操作权限
 - 统计信息等
 
关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息
数据定义
定义模式
为用户WANG定义一个学生-课程模式S-T
CREATE SCHEMA “S-T” AUTHORIZATION WANG
CREATE SCHEMA “S-T” AUTHORIZATION WANG
改语句没有指定 模式名 , 模式名隐含为用户名
- 定义模式实际上定义了一个命名空间(目录)
 - 在这个空间中可以定义该模式包含的数据库对象,例如基本表、视图、索引等
 - 在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句
 
CREATE SCHEMA<模式名>AUTHORIZATION<用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>]
 
删除模式
DROP SCHEMA <模式名><CASCADE|RESTRICT>
- CASCADE (级联) 
  
- 删除模式的同时把该模式中所有的数据库对象全部删除
 
 - RESTRICT (限制) 
  
- 如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行
 - 仅当该模式中没有任何下属的对象时采纳执行
 
 
DROP SCHEMA ZHANG CASCADE
删除模式ZHANG
同时该模式中定义的表也被删除
基本表的定义
定义基本表
	CREATE TABLE <表名>       /* 基本表的名称 */
	(<列名><数据类型>[<列级完整性约束条件>]	/* 组成改表的列 */
	[,<列名><数据类型>[<列级完整性约束条件>]
	...
	[,<表级完整性约束条件>]);
 
- 列级完整性约束条件:涉及相应属性列的完整性约束条件
 - 表级完整性约束条件:涉及一个或多个属性列的完整性约束条件
 - 如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上
 
建立学生表Student。学号是主码,姓名取值唯一
	CREATE TABLE Student
	(
		Son CHAR(9) PRIMARY KEY,
		Sname CHAR(2) UNIQUE,
		Ssex CHAR(2),
		Sage SMALLINT,
		Sdept CHAR(2)
	);
 
建立一个课程表Course
	CREATE TABLE Course
	(
		Cno CHAR(4) PRIMARY KEY,
		Cname CHAR(40),
		Cpno CHAR(4),
		Ccredit SMALLINT,
		FOREING KEY(Cpno) REFERENCES Course(Cno)
	);
 
建立一个学生选课表SC
	CREATE TABLE SC
	(
		Sno CHAR(9),
		Cno CHAR(4),
		Grade SMALLINT,
		PRIMARY KEY(Sno,Cno),
		FOREIGN KEY (Sno) REFERENCES Student(Sno),
		FOREIGN KEY (Cno) REFERENCES Student(Cno)
	);
 
数据类型
关系模型中的“域”的概念用数据类型来实现
定义表的属性时需要指明其数据类型及长度
选用哪种数据类型
- 取值范围
 - 要做哪些运算
 
模式与表
每一个基本表需属于某个模式
定义基本表所属模式的方式:
-  
方法一:在表名中明显地给出模式名
Create table “S-T”.Student(…);
 -  
方法二:在创建模式的同时创建表
 -  
方法三:设置所属的模式
 
创建基本表(其他数据库对象也一样)时,若没有指定模式,系统根据搜索路径来确定该对象所属的模式
关系数据库管理系统会以“搜索路径”指向的模式作为数据库对象的模式名
设置搜索路径的方式:
SET search_path TO "S-T",PUBLIC
修改基本表
	ALTER TABLE<表名>
	 [ADD[COLUMN]<新列名><数据类型>[完整性约束]]
	 [ADD<表级完整性约束>]
	 [DROP[COLUMN]<列名>[CASCADE|RESTRICT]]
	 [DROP CONSTRAINT<完整性约束名>[RESTRICT|CASCADE]]
	 [ALTER COLUMN<列名><数据类型>];
 
- <表名>是要修改的基本表
 - ADD子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件
 - DROP COLUMN子句用于删除表中的列 
  
- 如果指定了CASCADE短语,则自动删除引用了改列的其他对象
 - 如果指定了RESTRICT短语,则如果该列被其他对象引用,关系数据库管理系统将拒绝删除改列
 
 - DROP CONSTRAINT子句用于删除指定的完整性约束条件
 - ALTER COLUMN子句用于修改原有的列定义,包括修改列名和数据类型
 
向Studnet表增加 入学时间 列 ,其数据类型为日期型
 ALTER TABLE Student ADD S_entrance DATE;
不管基本表中原来是否已有数据,新增加的列一律为空值
将年龄的数据类型由字符型改为整型
ALTER TABLE Student ALTER COLUMN Sage INT;
增加课程名称必须取唯一值的约束条件
ALTER TABLE Course ADD UNIQUE(Cname);
删除基本表
DROP TABLE <表名> [RESTRICT|CASCADE];
-  
RESTRICT:删除表是有限制的
- 欲删除的基本表不能被其他表的约束所引用
 - 如果存在依赖该表的对象,则此表不能被删除
 
 -  
CASCADE:删除改表没有限制
- 在删除基本表的同时,相关的依赖对象一起删除
 
 
删除Student表
 DROP TABLE Student CASCADE
- 基本表定义被删除,数据被删除
 - 表上建立的索引、视图、触发器等一般也被删除
 
索引的定义
建立索引的目的:加快查询速度
关系数据库管理系统中常见索引:
- 顺序文件上的索引
 - B+树索引
 - 散列(hash)索引
 - 位图索引
 
特点:
- B+树索引具有动态平衡的优点
 - HASH索引具有查找速度快的特点
 
谁可以建立索引
- 数据库管理员或表的属主(即建立表的人)
 
谁维护索引
- 关系数据库管理系统自动完成
 
使用索引
- 关系数据库管理系统自动选择合适的索引作为存取路径,用户不必也不能显式地选择索引
 
建立索引
语句格式:
	CREATE [UNIQUE][CLUSTER]INDEX<索引名>
	ON<表名>(<列名>[<次序>][,<列名>[<次序>]]..);
 
- <表名>:要建索引的基本表的名字
 - 索引:可以建立在该表的一列或多列上,各列名之间用逗号分隔
 - <次序>:指定索引值的排序次序,升序:ASC,降序:DESC 缺省值:ASC
 - UNIQUE:此索引的每一个索引值只对应唯一的数据记录
 - CLUSTER:表示要建立的索引是聚簇索引
 
为学生-课程数据库中的Student,Course,SC三个表建立索引
- Student表按学号升序建唯一索引
 - Course表按课程号升序建唯一索引
 - SC表按学号升序和课程号降序建唯一索引
 
	CREATE UNIQUE INDEX  Stusno ON Student(Sno);
	CREATE UNIQUE INDEX  Coucno ON Course(Cno);
	CREATE UNIQUE INDEX  SCno ON SC(Sno ASC,Cno DESC);
 
修改索引
	ALTER INDEX <旧索引名> RENAME TO <新索引名>
 
将SC表的SCno索引名改为SCSno
	ALTER INDEX SCno RENAME TO SCSno
 
删除索引
	DROP INDEX <索引名>;
 
删除索引时,系统会从数据字典中删去有关该索引的描述
删除Student表的Stusname索引
	DROP INDEX Stusname;










