目录
基本表
定义基本表
语法格式:
CREATE TABLE <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[ <列级完整性约束条件>] ] …
[,<表级完整性约束条件> ] );
要求:
如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级
约束类型(五大约束):
名称 | 作用 | 实现的完整性 |
---|---|---|
Primary key | 定义主键,保证主键列无重复值 | 实体完整性 |
Unique | 保证该列无重复值 | 实体完整性 |
Foreign key | 定义外键,保证数据表间数据的一致性 | 参照完整性 |
Check | 定义表中某些列的数据范围 | 自定义完整性 |
NOT NULL | 定义表中某些列的数据不为空 | 自定义完整性 |
Default | 为列的数据提供默认值 | 自定义完整性 |
数据基本类型:
数据类型 | 含义 |
---|---|
CHAR(n) | 长度为n的定长字符串 |
VARCHAR(n) | 最大长度为n的变长字符串,实际存储有效长度 |
INT | 长整数(也可以写作 INTEGER) |
SMALLINT | 短整数 |
NUMERIC(p,d) | 定点数,由p位数字(不包括符号、小数点)组成,小数后面有d位数字 |
REAL | 取决于机器精度的浮点数 |
Double Precision | 取决于机器精度的双精度浮点数 |
FLOAT(n) | 浮点数,精度至少为n位数字 |
DATE | 日期,包含年、月、日,格式为 YYYY-MM-DD |
TIME | 时间,包含一日的时、分、秒,格式为 HH:MM:SS |
数据库与表:
- 关系:
- 每一个表都属于某一个数据库
- 一个数据库可以包含多个表
例子:
建立一个“学生选课”表SC
CREATE TABLE SC
(Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY (Sno,Cno),
/* 主码由两个属性构成,必须作为表级完整性进行定义*/
FOREIGN KEY (Sno) REFERENCES Student(Sno),
/* 表级完整性约束条件,Sno是外码,被参照表是Student */
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/* 表级完整性约束条件, Cno是外码,被参照表是Course*/
);
修改基本表
语法格式:
ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ] ]
[ DROP <完整性约束名> ]
[ ALTER COLUMN<列名> <数据类型> ]
[ADD [COLUMN<约束名> ] <约束定义> ]
;
例子:
- 向Student表增加“入学时间”列,其数据类型为日期型 .
ALTER TABLE Student ADD S_entrance DATE;
- 将年龄的数据类型由字符型 (假设原来的数据类型是字符型)改为整数 .
-
ALTER TABLE Student ALTER COLUMN Sage INT;
删除基本表
语法格式:
DROP TABLE <表名>[RESTRICT| CASCADE];(缺省情况是 RESTRICT)
说明:
- RESTRICT 欲删除的基本表不能被其他表的约束所引用如果存在依赖该表的对象,则此表不能被删除,删除表是有限制的
- CASCADE 在删除基本表的同时,相关的依赖对象一起删除,表上建立的索引、视图、触发器等一般也将被删除.删除该表没有限制
例子:
- 删除Student表
DROP TABLE Student CASCADE ;
视图
特点:
- 是从一个或几个基本表(或视图)导出的表
- 只存放视图的定义,不存放视图对应的数据
- 基表中的数据发生变化,从视图中查询出的数据也随之改变
- 一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化
特殊用途:
定义基本表是,为了减少数据库中的沉余数据,表中只存放基本数据,由基本数据经过各种计算派生出的数据一般是不存储的,但由于视图中数据并不是实际存储,所以定义视图时可以根据应用的需要,设置一些派生属性列.这些派生属性由于在基本表中并不实际存在也称它们为虚拟列.带虚拟列的视图也称为带表达式的视图
作用:
- 视图能够简化用户的操作
- 视图使用户能以多种角度看待同一数据
- 视图对重构数据库提供了一定程度的逻辑独立性
- 视图能够对机密数据提供安全保护
- 适当的利用视图可以更清晰的表达查询
基于视图的操作:
- 查询
- 删除
- 受限更新
- 定义基于该视图的新视图
行列子集视图:
从单个基本表导出,且只是去掉了基本表的某些行和某些列,但保留了主码
建立视图:
- 语法格式:
- CREATE VIEW
<视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];
- CREATE VIEW
- 说明:
- WITH CHECK OPTION
- 表示对视图进行 UPDATE , INSERT 和 DELETE 操作时要保证更新,插入,删除的行满足视图定义的谓词条件(即子查询中的条件表达式)
- RDBMS 执行 CREATE VIEW 语句时只是把视图定义存入数据字典,并不执行其中的 SELECT 语句.
- 在对视图查询时,按视图的定义从基本表中将数据查出
- WITH CHECK OPTION
- 要求:
- 子查询可以使任意复杂的 SELECT 语句,但是子查询不允许含有 ORDER BY 子句和 DISTINCT 短语
- 下列三种情况下必须指明组成视图的所有名字
- 某个目标列不是单纯的属性名,而是聚集函数或列表达式
- 多表连接时选出几个同名列作为视图的字段
- 需要在视图中为某个列启用新的更合适的名字
- 必须明确指定组成视图的所有列名情况:
- 的情况 某个目标列不是单纯的属性名,而是聚集函数或列表达式
- 多表连接时选出了几个同名列作为视图的字段
- 需要在视图中为某个列启用新的更适合的名字
- 例子:
- 建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生
CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept= 'IS' WITH CHECK OPTION;
- 基于多个基表的视图 (建立信息系选修了1号课程的学生视图)
CREATE VIEW IS_S1(Sno,Sname,Grade) AS SELECT Student.Sno,Sname,Grade FROM Student,SC WHERE Student.Sno=SC.Sno AND Sdept= 'IS' AND SC.Cno= '1';
- 分组视图 (将学生的学号及他的平均成绩定义为一个视图假设SC表中“成绩”列Grade为数字型)
CREATE VIEW S_G(Sno,Gavg) AS SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno;
- 基于视图的视图 (建立信息系选修了1号课程且成绩在90分以上的学生的视图)
CREATE VIEW IS_S2 AS SELECT Sno,Sname,Grade FROM IS_S1 WHERE Grade>=90;
- 建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生
- 例子解析:
- 当对 IS_Student 视图的更新操作:
- 修改操作:在选择条件处自动加上 Sdept= 'IS' 的条件
- 删除操作:在选择条件处自动加上 Sdept= 'IS' 的条件
- 插入操作:在选择条件处自动检查 Sdept 属性值是否为 'IS' (如果不是,则拒绝该插入操作.如果没有提供 Sdept 属性值,则自动定义Sdept为 'IS')
- 当对 IS_Student 视图的更新操作:
删除视图:
- 语法格式:
- DROP VIEW <视图名>[CASCADE];
- 作用:
- 该语句从数据字典中删除指定的视图定义,如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除
- 注意:
- 删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除
视图查询:
- 语法格式:
- 用户角度:查询视图与查询基本表相同用SETECT来查询视图
- RDBMS 实现视图查询方法:
- 视图消解法(View Resolution):
- 进行有效性检查
- 转换成等价的对基本表的查询
- 执行修正后的查询
- 视图消解法(View Resolution):
- 视图消解法的局限:
- 有些情况下,视图消解法不能生成正确查询
更新视图:
- 限制:
- 一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新
- 允许对行列子集视图进行更新
- 对其他类型视图的更新不同系统有不同限制
- 若视图是由两个以上基本表导出的,则此视图不允许更新
- 若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但是允许执行DELETE操作,
- 若视图的字段来自聚集函数,则此视图不允许更新
- 若视图定义中含有GROUP BY子句,则此视图不允许更新
- 若视图定义中含有DISTINCT,则此视图不允许更新