前言:

​ 这注定是一个不平凡的专业课,2020年,竟然tad在家上网课,也是醉的不要不要的啦,关键是还没有课本,这个你说说谁受的了,笔者好不容易拿到一个pdf的书,本着计算机传统的囫囵吞枣的读起来,这不学完了第一篇在这儿记录一下,没事儿的时候拿来巩固一下,加强记忆!

第一章 绪论

1.1 数据库系统概述

1、数据库系统的四个基本概念

数据(Data):描述事物的符号记录称为数据,数据是数据库存储的基本对象。

数据库(DB):长期存储在计算机内、有组织的、可共享的大量数据的集合。数据库中的数据按照一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。概括地讲,数据库数据具有永久储存有组织可共享三个基本特点。

数据库管理系统(DBMS):位于用户和操作系统之间的一层数据管理软件。主要功能包括提供数据定义语言(DDL)、数据的组织存储和管理、提供数据操纵语言(DML)、事务管理和运行管理、创建和维护等。

数据库系统(DBS):数据库系统是由数据库、数据库管理系统、应用程序和数据库管理员(DBA)组成的存储、管理和维护数据的系统。DBS=DB+DBMS+APP+DBA

2、数据管理技术的产生和发展

数据管理的三个阶段:人工管理文件管理数据库管理系统

文件系统与数据库管理系统的区别

人工管理阶段 文件系统阶段 数据库系统阶段
数据的管理者 用户(程序员) 文件系统 数据库管理系统
数据面向的对象 某一应用程序 某一应用 现实世界(法人、社团)
数据的共享程度 无共享,冗余性极大 共享性差,冗余度大 共享性高,冗余度小
数据的独立性 不独立,完全依赖于程序 独立性差 具有高度的物理独立性和一定的逻辑独立性
数据的结构性 无结构 记录内有结构、整体无结构 整体结构化,用数据模型描述
数据控制能力 应用程序自己控制 应用程序自己控制 由数据库管理系统提供数据安全性、完整性、并发控制和恢复能力

3、数据库系统的特点

数据结构化;数据的共享性高、冗余性低且易扩充;数据独立性高;数据由数据库管理系统统一管理和控制。

1.2 数据模型

数据模型:对现实世界数据特征的抽象,用来描述数据、组织数据和操作数据,是数据库系统的核心和基础。

1、两类数据模型:

①概念模型 ②逻辑模型和物理模型

🌂概念模型:按照用户的观点对数据和信息建模,主要用于数据库设计。
🌂逻辑模型:按照计算机系统的观点对数据建模,主要用于数据库管理系统的实现。
🌂物理模型:对数据最底层的抽象,描述数据在系统内部或存储介质上的表示方式和存取方法。
🌂构建数据模型的方法:将现实世界抽象为信息世界,得到概念模型;将信息世界转换为机器世界,得到DBMS支持的数据模型。

2、概念模型:

信息世界中的基本概念:
(1)实体:客观存在并可相互区别的事物。
(2)属性:实体的特性称为属性。
(3)码:唯一标识实体的属性集称为码。
(4)实体型:用实体名及其属性名集合来抽象和刻画同类实体,称为实体型。
(5)实体集:同一类型的实体的集合称为实体集。
(6)联系:实体内部的联系指组成实体的属性之间的联系,实体之间的联系指不同实体集之间的联系。实体之间的联系有一对一、一对多和多对多等多种类型。

概念模型的表示方法:实体-联系(E-R)方法,该方法使用E-R图描述概念模型。

3、数据模型的组成要素

数据模型通常由数据结构数据操作完整性约束条件三部分组成。数据结构描述数据库组成对象和对象之间的联系;数据操作指对数据库中各种对象(型)的实例(值)允许执行操作的集合;数据的完整性约束条件是一组完整性规则,包括实体完整性、参照完整性和用户定义的完整性。

4、常用的数据模型

层次模型、网状模型、关系模型、面向对象数据模型、对象关系数据模型、半结构化数据模型等。

5、层次模型(用的少)

优点:

🌂数据结构简单清晰。

🌂因为记录之间的联系用有向边表示,这种联系在DBMS中通常使用指针实现,查询效率高。层次模型数据库性能优于关系数据库,不低于网状数据库。

🌂提供了良好的完整性支持。进行插入操作时,如果没有对应的双亲结点就不能插入它的子女结点值。进行删除操作时,如果删除双亲结点,则相应的子女结点值也将被同时删除。

缺点:

🌂现实世界中的很多联系是非层次性的。如果结点之间具有多对多联系,不再适合使用层次模型表示。如果一个子女结点确实具有多个双亲结点,使用层次结构模型表示的时候就会出现大量的冗余,且操作复杂。

🌂查询子女结点必须通过双亲结点。

🌂由于结构严密,层次命令趋于程序化。

6、网状模型(用的少)

优点:

🌂能够更为直接地表示现实世界。

🌂具有良好的性能,存取效率高。
缺点:

🌂结构复杂,伴随应用环境的扩大,数据结构变得越来越复杂,不利于最终用户掌握。

🌂网状模型的数据定义语言和数据管理语言复杂。

🌂由于记录之间的联系通过存取路径实现,应用程序在访问数据的时候必须选择恰当的存取路径,因此用户必须了解系统结构的细节,导致加重了编写应用程序的负担。

7、关系模型

优点:

🌂关系模型建立在严格的数学概念的基础之上。

🌂关系模型概念单一。无论是实体还是实体之间的联系都用关系来表示。对数据的检索和更新结果也是基于关系(表)的。所以,数据结构简单清晰,用户易懂易用。

🌂关系模型的存取路径对用户透明,从而具有较高的数据独立性,更好的安全保密性,也简化了程序员的工作和数据库开发建立的工作。

缺点:

🌂由于存取路径对用户是透明的,查询效率往往不如格式化数据模型。

🌂为了提高系统性能,数据库管理系统必须对用户的查询请求进行优化。

关系模型的数据结构:
(1)关系:一个关系对应通常所说的一张表。
(2)元组:表中的一行即为一个元组。
(3)属性:表中的一列即为一个属性。
(4)码/键:唯一确定一个元组的属性集。
(5)域:一组具有相同数据类型的值的集合。属性的取值范围来自某个域。
(6)分量:元组中的一个属性值。
(7)关系模式:对关系的描述,一般表示为

1
2
关系名(属性1,属性2,…,属性n)
关系模型的数据操作:增删改查

【必考】关系的完整性约束:实体完整性、参照完整性、用户定义的完整性
关系模型的评价:严格数学定义、概念单一、存储路径对用户透明、查询效率稍稍逊于格式化数据模型。

1.3 数据库系统的结构

1、数据库系统模式的概念

“型”“值”:型是指对某一类数据的结构和属性的说明,值是型的一个具体赋值
模式:数据库中全体数据的逻辑结构和特征的描述,仅仅涉及型的描述,不涉及具体的值。模式的一个具体值称为模式的一个实例。模式是相对稳定的,实例是相对变动的。

2、数据库系统的三层模式结构

模式:也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共视图。在数据库系统模式结构中处于中间层,与硬件平台和应用程序无关。一个数据库只有一个模式。

外模式:也称子模式和用户模式,它是数据库用户(应用程序员与最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。外模式通常是模式的子集,一个数据库可以有很多外模式。

内模式:也称存储模式,一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式。例如,记录的存储方式是堆存储、升序/降序存储还是聚簇存储;B+树索引还是哈希索引;是否压缩存储,是否加密;数据存储记录结构是定长结构还是边长结构;等等。

3、数据库的而二级映像功能与数据独立性

数据库的二级映像功能:外模式/模式映像、模式/内模式映像。

外模式/模式映像针对于每一个外模式,定义了外模式与模式的对应关系;模式/内模式映像是唯一的,定义了数据全局逻辑结构与存储结构之间的对应关系。

数据的逻辑独立性:当模式改变时,由DBA对各个外模式/模式的映像作相应改变,可以使外模式保持不变。应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据逻辑独立性。

数据的物理独立性:当数据库的存储结构改变时,由DBA对模式/内模式映像作出相应改变,可以使模式保持不变,从而应用程序也不必改变,保证了数据与程序的物理独立性,简称数据物理独立性。

1.4 数据库系统的组成

数据库系统=数据库+数据库管理系统+应用程序+数据库管理员
数据库管理员(DBA)的职责:
(1)决定数据库中的信息内容和结构;
(2)决定数据库的存储结构和存取策略;
(3)定义数据的安全性要求和完整性约束条件;
(4)监控数据库的使用与运行;
(5)数据库的改进、重组和重构

第二章 关系数据库

2.1 关系数据结构及形式化定义

关系模型三要素:关系数据结构、关系操作集合、关系完整性约束

1、关系

关系:描述现实世界的实体以及实体之间的各种联系的单一结构类型就是关系,站在用户的视角,关系就是一张二维表

(1)域:

域是一组具有相同数据类型的集合。

(2)笛卡尔积:

给定的一组域D1,D2,…,Dn,允许其中某些域是相同的,它们的笛卡尔积定义为

其中每一个元素(d1,d2,…,dn)叫做一个n元组,或简称元组,元组中的每一个分量di叫做一个分量。一个域允许的不同取值个数称为这个域的基数。

1
D1×D2×…×Dn={(d1,d2,…,dn)|di∈Di,i=12,…,n}

其中每一个元素(d1,d2,…,dn)叫做一个n元组,或简称元组,元组中的每一个分量di叫做一个分量。一个域允许的不同取值个数称为这个域的基数。

(3)关系:

D1×D2×…×Dn的子集叫做在域D1,D2,…,Dn上的关系,表示为R(D1,D2,…,Dn),R表示关系的名字,n是关系的目或度。关系中的每个元素是关系中的元组,用t表示。

关系是笛卡尔积的有限子集,所以关系也是一张二维表,表的每一行表示一个元组,表的每一列对应一个域,区分域的列名就是属性名。

🌂候选码:某一属性组的的值能够唯一地标识一个元组,但是它的任何一个真子集不能,则称该属性组为候选码
🌂主码:若一个关系有多个候选码,则选定其中一个为主码。
🌂主属性:候选码的诸属性为主属性,不包含在任何候选码中的属性称为非主属性。
🌂全码:关系模式的所有属性构成这个关系模式的候选码,称为全码。
🌂关系类型:基本关系(基本表或基表)、查询表和视图表。基本表是实表;查询表是查询结果对应的表;视图表是导出表,是虚表。
🌂关系的补充限定:禁止无限关系,附加属性名来消除关系属性的有序性
🌂基本关系的6条性质:列同质、异列可同域、行列无序性、候选码唯一性、分量原子性

2、关系模式

关系模式:关系的描述称为模式,它的形式化表达为R(U,D,DOM,F),其中R为关系名,U为属性名集合,D为属性域,DOM为属性向域的映像集合,F为属性间数据的依赖关系集合。

3、关系数据库(略)

4、关系模型的存储结构(略)

2.2 关系操作

1、基本的关系操作:增删改查

查询操作:选择、投影、连接、除、并、差、交、笛卡尔积

2、关系数据语言的分类:关系代数和关系演算

结构化查询语言SQL:DQL、DDL、DML、DCL

2.3 关系的完整性

【必考】关系模型三类完整性约束:实体完整性、参照完整性、用户定义完整性

1、实体完整性:

主码不可重复且不为空

2、参照完整性:

若属性/属性组F是基本关系R的外码,它与基本关系S的主码Ks相对应(R与S可以是同一关系),则对于R中每个元组在F上的值必须取空值或S中某个元组的主码值。

外码:设F是基本关系R的属性/属性集,但不是关系R的码,Ks是基本关系S的主码,如果F与Ks相对应,则称F是R的外码,并称R为参照关系,S为被参照关系或目标关系,R与S可以是同一关系。

3、用户定义的完整性

2.4 关系代数

1、传统的集合运算:

并、差、交、笛卡尔积

2、专门的关系运算:

选择、投影、连接、除
🌂(1)选择:σF(R),F是选择条件
🌂(2)投影:ΠA(R),A是属性列
🌂(3)连接:从两个关系的笛卡尔积中选取属性间满足条件AθB的元组。
等值连接:θ为“=”的连接运算。
自然连接:特殊的等值连接,要求比较的分量必须是同名的属性组,并在结果中去掉重复的列。
悬浮元组:自然连接中,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,因此被舍弃,这些元组称为悬浮元组。
外连接:进行自然连接时,保留悬浮元组,而在其他属性列上填空值。分为左外连接和右外连接,分别表示保留哪一边关系的悬浮元组。
🌂(4)除运算:给定关系R(X,Y)和S(Y,Z),X,Y,Z为属性组。R中的Y和S中的Y可以有不同的属性名但必须有相同的域集。R与S的除运算得到一个新的关系P(X),P是R中满足以下条件的元组在X属性列上的投影:元组在X上的分量x的象集Yx包含S在Y上的投影的集合。记作:

1
2
R÷S={tr[X]|tr∈R∧ΠY(S)⊆Yx}
其中Yx为x在R中的象集,x=tr[X]。

象集Yx:给定一个关系R(X,Y),X和Y为属性组。当t[X]=x时,x在R中的象集定义为:

1
Yx={t[Y]|t∈R,t[X]=x}

如何理解除运算:R÷S,将R中属性分为公共属性和非公共属性,对于同一个非公共属性值,如果公共属性值在S中的元组中都出现过,那么把非公共属性值加入结果中。除运算一般用于解决“至少”问题。

2.5 关系演算(略)

第3章 关系数据库标准语言SQL

3.1 SQL概述

1、SQL的产生与发展

2、SQL语言的特点:

(1)综合统一,集DDL、DML、DCL、DQL于一身。
(2)高度非过程化。
(3)面向集合的操作方式。
(4)以同一种语法结构提供多种使用方式。
(5)语言简介,易学易用。

3、SQL的基本概念

外模式——视图,模式——基本表,内模式——存储文件

3.2 学生-课程数据库(略)

之后几节全部是重点,不考察exists谓词

3.3 数据定义

1、模式的定义与删除

定义模式:

1
2
CREATE SCHEMA 模式名 AUTHORIZATION 用户名;
CREATE SCHEMA 模式名 AUTHORIZATION 用户名 [表定义子句|视图定义子句|授权定义子句]

删除模式:

1
DROP SCHEMA 模式名 [CASCADE|RESTRICT]

2、基本表的定义、删除与修改

定义基本表:

1
2
3
4
5
6
sqCREATE TABLE 表名 (
列名 数据类型 [列级完整性约束条件],
[列名 数据类型 [列级完整性约束条件]]
...
[, 表级完整性约束条件]
);

参照完整性约束条件:

1
FOREIGN KEY(Sno) REFERENCES Student(Sno)

数据类型:定长与变长字符串,大对象,整型,定点数,浮点数,布尔型,时间类型

修改基本表:

1
2
3
4
5
6
ALTER TABLE 表名 
[ADD [COLUMN] 新列名 数据类型 [完整性约束]]
[ADD 表级完整性约束]
[DROP [COLUMN] 列名 [CASCADE|RESTRICT]]
[DROP [CONSTRAINT] 完整性约束名 [RESTRICT|CASCADE]]
[ALTER COLUMN 列名 数据类型];

删除基本表:

1
DROP TABLE 表名 [RESTRICT|CASCADE];

3、索引的建立与删除

索引类型:顺序文件上的索引、B+树索引、散列索引、位图索引
建立索引:

1
CREATE [UNIQUE|CLUSTER] INDEX 索引名 ON 表名(列名 [ASC|DESC] [, 列名 [ASC|DESC]] ... );

修改索引:

1
ALTER INDEX 旧索引名 RENAME TO 新索引名;

删除索引:

1
DROP INDEX 索引名;

4、数据字典:

记录数据库中所有定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、权限定义、统计信息,的一组系统表。

3.4 数据查询

1
2
3
4
5
SELECT [ALL|DISTINCT] 目标列表达式[, 目标列表达式] ... 
FROM 表名|视图名[, 表名|视图名] | (SELECT语句) [AS] 别名
[WHERE 条件表达式]
[GROUP BY 列名1 [HAVING 条件表达式]]
[ORDER BY 列名2 [ASC|DESC]];

1、单表查询

常用的查询条件

查询条件 谓词
比较 关系运算符,NOT
确定范围 BETWEEN AND,NOT BETWEEN AND
确定集合 IN,NOT IN
字符匹配 LIKE,NOT LIKE
空值 IS NULL,IS NOT NULL
多重条件 AND,OR,NOT

聚集函数

聚集函数 功能
COUNT(*) 统计元组个数
COUNT([DISTINCT ALL] 列名) 统计一列中值的个数
SUM([DISTINCT ALL] 列名) 计算一列值的总和
AVG([DISTINCT ALL] 列名) 计算一列值的平均值
MAX([DISTINCT ALL] 列名) 求一列值中的最大值
MIN([DISTINCT ALL] 列名) 求一列值中的最小值

GROUP BY子句:将查询结果按照某一列多列的值分组,值相等的为一组。分组后聚集函数将作用于每一组,即每一组都有一个函数值。HAVING子句与WHERE子句的区别在于HAVING子句作用于组,可以使用聚集函数,但WHERE子句中不可以。
具体使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT Sno,Sname FROM Student;
SELECT * FROM Student;
SELECT Sname,'Year of Birth',2014-Sage BIRTHDAY,LOWER(Sdept);/*目标列表达式可以是属性列,常量,函数,也可以是表达式,通过指定别名可以改变列标题*/
SELECT DISTINCT Sno FROM SC;/*去重*/
SELECT Sname FROM Student WHERE Sdept='cs';/*比较大小*/
SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;/*确定范围*/
SELECT Sname,Ssex FROM Student WHERE Sdept IN ('cs','ma','is');/*确定集合*/
SELECT * FROM Student WHERE Sname LIKE '刘%';/*字符匹配*/
SELECT * FROM SC WHERE GRADE IS NULL;/*空值查询*/
SELECT * FROM Student WHERE Sdept='cs' AND Sage<20;/*多重条件查询*/
SELECT COUNT(*) FROM Student;/*使用聚集函数*/
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;/*使用GROUP BY子句*/

2、连接查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 等值连接
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno;
-- 自身连接
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno=SECOND.Cno;
-- 外连接
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON(Student.Sno=SC.Sno);
-- 多表连接
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Sno=Course.Cno;

嵌套循环连接算法:R与S等值连接,先在R找到第一个元组,扫描S表查找符合等值条件的S表元组,合并后形成结果表中第一个元组,然后再在R找第二个元组,重复以上步骤,直到遍历完整个R表。使用索引可以提高查找的效率。

3、嵌套查询

嵌套查询:一个SELECT-FROM-WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。需要特别指出的是子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序。

不相关子查询:子查询的查询条件不依赖于父查询。

相关子查询:子查询的查询条件依赖于父查询。相关子查询的一种执行过程为,从外层查询中取出一个元组,将它的属性值传给内层查询,执行内层查询得到一个值,用该值代替内层查询,得到外层查询,执行外层查询。

(1)带有IN谓词的子查询
1
2
3
4
5
6
7
SELECT Sname 
FROM Student
WHERE Sno IN(
SELECT Sno
FROM SC
WHERE Cno='2'
);
(2)带有比较运算符的子查询
1
2
3
4
5
6
7
SELECT Sno,Sname,Sdept
FROM SC x
WHERE Grade>=(
SELECT AVG(Grade)
FROM SC y
WHERE y.Sno=x.Sno
);
(3)带有ANY(SOME)或ALL谓词的子查询

op ANY表示对于子查询中某一个值条件成立则为真,op是关系运算符
op ALL表示对于子查询中所有值条件都成立才为真,op是关系运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 查询年龄至少小于一个计科学生的非计科的学生的姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage<ANY(
SELECT Sage
FROM Student
WHERE Sdept='cs'
) AND Sdept <> 'cs';
-- 等价于
SELECT Sname,Sage
FROM Student
WHERE Sage<(
SELECT MAX(Sage)
FROM Student
WHERE Sdept='cs'
) AND Sdept <> 'cs';
(4)带有EXISTS谓词的子查询

带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真或假。内层查询不为空则为真,内层查询为空则为假。可以使用NOT运算符对逻辑值结果取反。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-- 查询选修了1号课程的学生
SELECT Sname
FROM Student
WHERE EXISTS(
SELECT *
FROM SC
WHERE Sno=Student.Sno AND Cno='1'
);
/*使用了相关子查询,对于每一个Student,将Sno属性值传入子查询中,执行子查询,
根据结果是否为空得到一个布尔值,为真时就将这个学生的姓名放在结果中。*/

-- 变态版子查询
-- 查询至少选修了学生201215122选修的全部课程的学生号码
/*
p:“学生201215122选修了课程y”
q:“学生x也选修了课程y”
查询:(∀y)p->q
转换:(∀y)p->q ≡ ┐(∃y(┐(p->q))) ≡ ┐(∃y(┐(┐p∨q))) ≡ ┐∃y(p∧┐q)
*/
SELECT DISTINCT Sno
FROM SC SCX -- 表示学生x
WHERE NOT EXISTS( -- 再次取反,表示x没有选修课程y的这种情况不出现
SELECT *
FROM SC SCY -- 表示学生201215122
WHERE SCY.Sno='201215122' AND NOT EXISTS( -- 取反,也就是x没有选修课程y
SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno -- 表示x也选修了课程y
)
);

4、集合查询

集合操作主要包括并操作(UNION)、交操作(INTERSECT)、差操作(EXCEPT),将两个SELECT语句通过集合操作运算符连接即可。

5、基于派生表的查询

子查询出现在FROM子句中。

3.5 数据更新

1、插入数据

1
2
3
4
5
6
-- 插入元组
INSERT INTO 表名 [(属性列1, 属性列2 ...)]
VALUES(常量1, 常量2 ...),[(常量1, 常量2 ...) ...];
-- 插入子查询结果
INSERT INTO 表名 [(属性列1, 属性列2 ...)]
子查询;

2、修改数据

1
2
3
4
UPDATE 表名
SET 列名=表达式[, 列名=表达式 ...]
[WHERE 条件];
-- 子查询也可以出现在UPDATE语句的where子句中

3、删除数据

1
2
3
4
DELETE
FROM 表名
[WHERE 条件];
-- 子查询也可以出现在DELETE语句的where子句中

3.6 空值的处理

空值的产生:插入仅给部分属性赋值的元组、外连接、空值的关系运算
空值的判断:IS NULL、IS NOT NULL
空值的约束条件:NOT NULL、UNIQUE、码属性不能为空
空值的算术运算比较运算逻辑运算:空值的算术运算结果为空值,空值的比较运算结果为UNKNOWN,UNKNOWN的逻辑运算结果如下:

1
NOT U = U, U AND U = U U AND T = U, U AND F = F,U OR U = U, U OR T = T, U OR F = U

3.7 视图

1、定义视图

(1)建立视图
1
2
3
4
5
CREATE VIEW 视图名 [(列名[, 列名]...)]
AS 子查询
[WITH CHECK OPTION];
/*WITH CHECK OPTION表示对视图进行UPDATE、INSERT、DELETE操作时
要保证执行操作的行满足视图定义中的谓词条件(即子查询中的条件表达式)*/

组成视图的所有列名全部省略或全部指定,必须指定列名的情况:

🌂某个目标列不是单纯的属性名,而是聚集函数或列表达式;
🌂多表连接时选出了几个同名列作为视图的字段
🌂需要在视图中为某个列启用新的更合适的名字

🌂CREATE VIEW语句并不执行子查询,而是在查询视图时才执行子查询

行列子集视图:从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,则称这类视图为行列子集视图。

🌂视图可以建立在基本表、视图、基本表和视图的组合之上。

虚拟列:由基本表经过计算导出的属性列称为虚拟列,带虚拟列的视图也称为带表达式的视图。

分组视图:用带有聚集函数和GROUP BY子句的查询定义的视图称为分组视图。

(2)删除视图
1
DROP VIEW 视图名 [CASCADE];

2、查询视图

查询视图的方法与查询表的方法一样。
视图消解:从数据字典中取出数据的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。这一转换过程称为视图消解。目前多数关系型数据库能够对行列子集视图的查询均能进行正确转换,但对非行列子集视图的查询就不一定能够转换,这类查询应当直接对基本表进行。

视图查询与派生表查询的区别:视图定义将永久保存在数据字典中,派生表是临时定义,执行后即被删除。

3、更新视图

视图是虚表,对视图的更新将转换为对基本表的更新。
使用WITH CHECK OPTION定义视图可以防止对非视图基本表数据进行操作。
视图并不总是可以更新的,一般地,行列子集视图是可更新的。

4、视图的作用

简化操作、多角度看待数据、为重构数据库提供一定程度逻辑独立性、安全性控制、更清晰的表达

第4章 数据库安全性

4.1 数据库安全性概述

数据库安全性:保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。

1、数据库的不安全因素:

非法入侵、数据泄露、安全环境的脆弱性

2、安全标准简介:

TCSEC、CC

4.2 数据库安全性控制

数据库安全性控制:身份鉴别、多层存取控制、审计、视图和数据加密

1、用户身份鉴别(略)

2、存取控制

🌂存取控制机制:

定义用户权限,并将用户权限登记到数据字典中
合法权限检查

🌂存取控制方法:

自主存取控制:采用授权方式实现存取控制,比较灵活。
强制存取控制:采用密级标定数据库对象,比较严格。

3、自主存取控制方法

用户权限二要素:数据库对象操作类型
授权:定义存取权限。
在关系型数据库系统中,存取控制的对象不仅有数据本身,还有数据库模式(数据库、基本表、视图和索引的创建)。

4、授权:授予与收回

(1)GRANT
1
2
3
4
GRANT 权限[, 权限]...
ON 对象类型 对象名[, 对象类型 对象名]...
TO 用户[, 用户]...
[WITH GRANT OPTION];-- 允许权限传播

eg:

1
2
3
4
5
GRANT SELECT ON TABLE Student TO U1;
GRANT ALL PRIVILEGES ON TABLE Student,Course TO U2,U3; -- mysql中不允许写多个用户和多个表
GRANT SELECT ON TABLE SC TO PUBLIC; -- mysql中没有PUBLIC
GRANT UPDATE(Sno),SELECT ON TABLE Student TO U4;
GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTION;
(2)REVOKE
1
2
3
4
REVOKE 权限[, 权限]...
ON 对象类型 对象名[, 对象类型 对象名]...
FROM 用户[, 用户]...
[CASCADE|RESTRICT]

eg:

1
2
3
4
REVOKE UPDATE(Sno) ON TABLE Student FROM U4;
REVOKE SELECT ON TABLE SC FROM PUBLIC;
REVOKE INSERT ON TABLE SC FROM U5 CASCADE;
REVOKE ALL PRIVILEGES,GRANT OPTION ON TABLE Student FROM U4;-- 收回一切权限

自主控制控制:用户可以“自主”地决定将数据的存取权限授予何人、决定是否也将“授权”的权限授予别人。因此称这样的存取控制是自主存取控制。

(3)创建数据库模式的权限

创建用户:

1
CREATE USER 用户名 [WITH DBA|RESOURCE|CONNECT];

🌂只有系统的超级用户才有权创建一个新的数据库用户
🌂新创建的数据库用户有三种权限:CONNECT、RESOURCE和DBA
🌂新用户默认的权限为CONNECT,拥有CONNECT权限的用户只能登录数据库
🌂拥有RESOURCE权限的用户能创建基本表和视图,成为所创建对象的属主,但不能创建模式,也不可以新建用户。数据库对象的属主可以把该对象上的权限授权给其他用户。
🌂拥有DBA权限的用户具有最高权限。
【注意】CREATE USER语句不是SQL标准

5、数据库角色

数据库角色:被命名的一组与数据库操作相关的权限,角色是权限的集合。使用角色管理数据库权限可以简化授权的过程。
角色的创建:

1
CREATE ROLE 角色名

给角色授权:

1
2
3
GRANT 权限[, 权限]...
ON 对象类型 对象名
TO 角色[, 角色]...

将一个角色授予其他用户或角色:

1
2
3
GRANT 角色[, 角色]...
TO 角色|用户[,角色|用户]...
[WITH ADMIN OPTION];-- mysql不支持WITH ADMIN OPTION

角色权限的收回:

1
2
3
REVOKE 权限[, 权限]...
ON 对象类型 对象名
FROM 角色[, 角色]...

6、强制存取控制方法(MAC)

基本思想:对系统控制下的所有主客体实施强制存取控制策略。在强制存取控制中,数据库管理系统所管理的全部实体被分为主体和客体两部分,主体包括用户和外部进程,客体包括数据库对象如文件、表、索引、视图。数据库系统为每个主体和客体指派敏感度标记,主体敏感度标记称为许可证级别,客体敏感度标记称为密级。同等或高许可证级别用户可以读取相应客体(规则Ⅰ),同等或低许可证级别用户可以写相应客体(规则Ⅱ),规则Ⅱ防止密级从高流向低从而泄密。MAC对数据进行密级标记,无论数据如何复制,标记与数据都是不可分割的整体,只有符合密级要求的用户才能访问,从而提供更高级别的安全性。

4.3 视图机制(略)

4.4 审计

审计:建立审计日志记录数据库操作

4.5 数据加密(略)

4.6 其他安全性保护(略)

第5章 数据库完整性

数据库的完整性:正确性+相容性
数据库完整性要求:定义完整性约束性机制+完整性检查+违约处理

5.1 实体完整性

1、实体完整性定义

两种约束条件说明方法:列级约束条件表级约束条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE Student(
Sno CHAR(9) PRIMARY KEY, -- 列级约束条件
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
-- 等价于
CREATE TABLE Student(
Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY(Sno) -- 表级约束条件
);

2、实体完整性检查和违约处理

唯一性检查+空值检查

5.2 参照完整性

1、定义参照性完整性

1
2
3
4
5
6
7
8
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 Course(Cno) -- 表级完整性约束
);

2、参照完整性检查和违约处理

可能破坏参照完整性的情况及违约处理

被参照表(如Student) 参照表(如SC) 违约处理
可能破坏参照完整性 插入元组 NO ACTION
可能破坏参照完整性 修改外码值 NO ACTION
删除元组 可能破坏参照完整性 NO ACTION/CASCADE DELETE/NULL
修改主码值 可能破坏参照完整性 NO ACTION/CASCADE UPDATE/NULL

显式说明参照完整性约束:

1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE SC(
Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno), -- 只能用表级实体完整性约束
FOREIGN KEY(Sno) REFERENCES Student(Sno)
ON DELETE CASCADE
ON UPDATE CASCADE, -- 表级完整性约束
FOREIGN KEY(Cno) REFERENCES Course(Cno)
ON DELETE NO ACTION
ON UPDATE CASCADE-- 表级完整性约束
);

5.3 用户定义的完整性

1、属性上的约束条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- 列值非空
CREATE TABLE SC(
Sno CHAR(9) NOT NULL, /* 列值非空 */
Cno CHAR(4) NOT NULL, /* 列值非空 */
Grade SMALLINT NOT NULL, /* 列值非空 */
PRIMARY KEY(Sno,Cno),
...
);
-- 列值唯一
CREATE TABLE DEPT(
Dno NUMERIC(2),
Dname CHAR(9) UNIQUE NOT NULL, /* 列值唯一,非空 */
Location CHAR(9),
PRIMARY KEY(Dno)
);
-- CHECK短语
CREATE TABLE Student(
Sno CHAR(9) PRIMARY KEY,
Sname CHAR(8) NOT NULL,
Ssex CHAR(2) CHECK(Ssex IN ('男','女')),
Sage SMALLINT,
Sdept CHAR(20)
);
-- 注意在MySQL8.0.16之前的版本不支持CHECK短语

2、元组上的约束条件

1
2
3
4
5
6
7
8
9
CREATE TABLE Student(
Sno CHAR(9),
Sname CHAR(8) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY(Sno),
CHECK(Ssex='女' OR Sname NOT LIKE 'Ms.%')
);

5.4 完整性约束命名子句

1、完整性约束命名子句

1
2
3
CONSTRAINT 完整性约束条件名 完整性约束条件
-- 完整性约束条件包括NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK短语
-- 完整性约束条件可以作为列级约束条件或表级约束条件出现

2、修改表中的完整性约束

1
2
ALTER TABLE 表名 ADD 完整性约束条件子句
ALTER TABLE 表名 DROP CONSTRAINT 完整性约束条件名

5.5 域中的完整性限制(略)

5.6 断言(略)

5.7 触发器

不同数据库触发器实现方式差异较大,其中MYSQL不支持语句级触发器。

1、定义触发器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- SQL标准触发器定义
CREATE TRIGGER 触发器名 -- 只有表的拥有者才有权创建触发器
BEFORE|AFTER 触发事件 ON 表名 -- 触发器只能定义在基本表上,触发事件可以是INSERT、DELETE、UPDATE
REFERENCING NEW|OLD ROW AS 变量
FOR EACH ROW|STATEMENT -- 触发器类型可以是行级触发器和语句级触发器
[WHEN 触发条件] 触发动作体
-- MySQL触发器定义
CREATE [DEFINER = 用户名] TRIGGER 触发器名
BEFORE|AFTER 触发事件
ON tbl_name FOR EACH ROW
[FOLLOWS|PRECEDES 其他触发器名]
触发动作体
/*触发动作体既可以是一个匿名PL/SQL过程块,也可以是对过程的调用。
如果是行级触发器,用户可以在过程体中使用NEW/OLD引用触发事件发生
之前的旧值和之后的新值*/

书上例题的MySQL写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-- 习题5.21
DROP TRIGGER IF EXISTS `lifang`.`sc_AFTER_UPDATE`;
DELIMITER $$
USE `lifang`$$
CREATE DEFINER = CURRENT_USER TRIGGER `lifang`.`sc_AFTER_UPDATE` AFTER UPDATE ON `sc` FOR EACH ROW
BEGIN
if new.grade >= 1.1 * old.grade
then
insert into sc_u values(new.sno,new.cno,old.grade,new.grade);
end if;
END$$
DELIMITER ;
-- 习题5.23
CREATE TABLE `lifang`.`insert_log` (
`numbers` INT UNSIGNED NOT NULL);
DROP TRIGGER IF EXISTS `lifang`.`worker_BEFORE_UPDATE`;
DELIMITER $$
USE `lifang`$$
CREATE DEFINER = CURRENT_USER TRIGGER `lifang`.`worker_BEFORE_UPDATE` BEFORE INSERT ON `worker` FOR EACH ROW
BEGIN
if(new.wpos="经理" and new.wwage<4000) then
set new.wwage=4000;
end if;
END$$
DELIMITER ;

2、激活触发器的顺序:

BEFORE触发器->触发事件->AFTER触发器

3、删除触发器

1
DROP TRIGGER 触发器名 ON 表名;