第一章:绪论
数据库的四个基本概念
数据、数据库、数据库管理系统、数据库系统
-
数据:数据是数据库中存储的基本对象
-
数据库:长期存储在计算机内,有组织,可共享的大量数据的集合
具有较小的冗余度、较高的数据独立性、易扩展性
-
数据库管理系统:是位于用户和操作系统之间的一层数据管理软件
-
数据库系统:由数据库、数据库管理系统(及其应用开发工具)、应用程序和数据库管理员组成的存储、管理、处理和维护数据的系统
数据库系统特点
1:数据结构化(文件系统和数据库系统的本质区别)
数据整体是结构化的,数据不再针对一个应用,而是面向全组织,具有整体的结构化
2:数据共享性高、冗余度低且易扩展
共享性高:不是面向某个应用,而是面向整个系统,因此可以被多个用户、多个应用共享使用
冗余度低:数据共享能够减少数据冗余,节约存储空间
易于扩展:存储结构化的数据,易于扩展
3:数据独立性高,包括数据物理独立性数据逻辑独立性
物理独立性:用户的应用程序和数据库中数据的物理存储是相互独立的,由模式/内模式映像保证
逻辑独立性:用户的应用程序和数据库的逻辑结构是相互独立的,由外模式/模式映像保证
4:数据由数据库管理系统统一管理和控制
数据模型
数据模型是对现实世界数据特征的抽象
第一类概念模型、第二类逻辑模型和物理模型
概念模型
- 主要用于对于数据库的设计
- 是现实世界到机器世界的一个中间层次
- 实体-联系方法(E-R方法也称为E-R模型,用E-R图来描述现实世界的概念模型)
信息世界的概念
- 实体:客观存在并相互区别的事物
- 属性:实体所具有的某一特性
- 码:唯一标识实体的属性集
- 实体型:学生(学号、姓名、性别、出生年月、所在院系、入学时间)就是一个实体型
- 实体集:全体学生就是一个实体集
- 联系:
- 实体之间的联系通常是指不同实体集之间的联系
- 实体之间的联系有一对一、一对多、多对多等多种类型
数据模型的组成三要素
- 数据结构
- 数据操作
- 数据完整性约束
常用的数据模型
层次模型
-
有且只有一个结点没有双亲结点,这个结点称为根结点
-
根以外的其他结点有且仅有一个双亲结点
-
适合一对多的关系,不适合多对多关系
在进行插入操作时,没有相应双亲结点值就不能插入它的子女结点值
在进行删除操作时,如果删除双亲结点值,则相应的子女结点值也被删除
网状模型
- 允许结点无双亲
- 一个结点可以有多个双亲
- 要为每个联系命名(在网状模型中联系不唯一)
关系模型
关系:一个关系对应一张表
元组:表中的一行
属性:表中的一列
码:表中的某个属性组
域:一组具有相同数据类型的值的集合
分量:元组中的一个属性值
关系模式:对关系的描述,如 学生(学号,姓名,年龄,性别,年级)
数据库系统结构
模式是数据库全体数据的逻辑结构和特征的描述,模式的一个具体值称为模式的一个实例,同一个模式可以有很多实例
数据库系统三级模式:外模式、模式和内模式三级组成
模式
描述的是数据的全局逻辑结构,所有用户的公共数据视图;
一个数据库只有一种模式
作为数据库的中间层,既不涉及数据的物理存储细节和硬件环境,
与具体应用程序、应用开发工具和高级程序设计语言无关
数据库管理系统提供模式数据定义语言(模式DDL)来严格定义模式
外模式
外模式也称为子模式或者用户模式,是数据库用户的数据视图,描述的是数据的局部逻辑结构
外模式通常是模式的子集
一个数据库可以有多个外模式
一个外模式可以被一个用户的多个应用系统所使用,但是一个应用程序智能使用一个外模式
数据库管理系统提供外模式数据定义语言(外模式DDL)来严格定义外模式
内模式
内模式也称为存储模式,是数据物理结构和存储方式的描述,也称为存储模式
- 一个数据库只有一个内模式
- 是对数据物理结构和存储方式的描述:比如索引方式是B+树索引还是hash索引、存储方式是升序或者降序、数据是否压缩
外模式/模式映像
当模式改变时,数据库管理员对外模式/模式映像做相应改变,
外模式保持不变,应用程序是根据数据的外模式编写的,应用程序不必修改,称为逻辑独立性
逻辑独立性:用户的应用程序和数据库的逻辑结构是相互独立的
模式/内模式映像
当存储方式发生改变时,只需要对模式/内模式映像做出改变,外部应用程序不必修改
物理独立性:用于的应用程序和数据库的数据物理存储是相互独立的
第二章:关系数据库
数据模型组成三要素:数据结构、数据操作和数据完整性约束
第二章内容按照 关系数据结构(2.1)、关系操作(2.2)、关系三类完整性约束(2.3)、关系代数(2.4,实现关系操作的语言)、关系演算来展开
关系数据结构
域
笛卡尔积
候选码:某一属性组的值能够唯一标识一个元组,而其子集不能
主码:从候选码中选择出一个
主属性:候选码中的诸属性称为主属性
非主属性(非码属性):不包含在候选码中的诸属性
全码:关系模式下所有属性是这个关系模式的候选码
关系三种类型
基本关系:基本表或者基表,实际存在的表,是实际存储数据的逻辑表示
查询表:查询结果对应的表
视图表:由基本表或者其他视图表导出的表,是虚表,不对应实际存储的数据
关系表中不允许还由表,简言之就是不允许“表中有表”
关系操作
关系操作包含查询操作、插入操作、删除操作、修改操作
查询操作:选择、投影、连接、除、并、差、交、笛卡尔积
其中选择、投影、并、差、笛卡尔积是5种基本操作
关系操作的特点是集合操作方式,即操作的对象和结果都是集合
关系完整性
关系模型中有三类完整性约束:实体完整性、参照完整性和用户定义完整性
实体完整性
属性A是关系R的主属性,A不能取空值
参照完整性
属性F是关系R的外码,参考S中的主码K值
- 取空值
- 等于S中某个元组主码值
用户自定义的完整性
用户定义的完整性就是针对某一具体关系数据库的约束条件
关系代数
并、差、交、笛卡尔积
选择
投影
投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组 (避免重复行)
连接
除
第三章:SQL
SQL的特点
-
综合统一
-
高度非过程化
在进行SQL数据操作时,只需要提出做什么,无需指明怎么做
-
面向集合的操作方式
-
语法结构提供多种使用方式:是嵌入式语言,能够嵌入到高级语言程序中
-
语言简洁、易学易用
一个关系数据库管理系统的实例中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包含多个表、视图和索引等数据库对象
数据定义
模式定义和删除
定义模式:定义模式实际上定义了一个命名空间,在这个空间中可以进一步定义该模式的数据库对象,如基本表、视图、索引
create scheme "S-T" autherization wang;
create scheme autherization wang; /*默认模式名为用户名*/
DROP SCHEME "S-T" cascade;/*级联方式删除,删除在这个模式下的所有数据库对象*/
DROP SCHEME wang RESTRICT;/*在该模式下已经定义了下属的数据库对象,如表和视图之类的,拒接执行该指令*/
基本表定义和删除
CREATE TABLE Course(
Cno CHAR(4) PRIMARY KEY,
Cname CHAR(10) NOT NULL,
Cpno CHAR(4),
FOREIGN KEY (Cpno) REFERENCES Course(Cno)
);
DROP TABLE Course RESTRICT;
DROP TABLE Course CASCADE;
索引定义、修改和删除
顺序文件索引:按照属性值升序或者降序存储关系,在该属性上建立一个顺序索引文件
顺序索引文件:属性值和相应元组指针
B+树索引:将索引属性组织成B+树形式,B+树叶节点为属性值和对应的元组指针
散列索引:建立若干桶,将索引属性按照散列函数映射到对应桶中,桶中存放索引属性值和对应元组指针
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);/*SC表按照学号升序和课程号降序建立唯一索引*/
ALTER INDEX SCno RENAME TO SCSno;
DROP INDEX SCSno;
数据查询
单表查询
- 查询指定列
SELECT Sname FROM Student;
- 查询全部列
SELECT * FROM STUDENT;
- 查询经过计算的值
SELECT SNAME,2014-SAGE FROM STUDENT;
- 消除取值重复的行,若无DISTINCT关键词,则默认为ALL
SELECT DISTINCT SNO FROM SC;/*消除结果表中重复行*/
- 查询满足条件的元组
- %表示任意长度字符串,如a%b表示以a开头,以b结尾的任意长度字符串
- _任意单个字符,a_b表示以a开头,以b结尾的长度为3的任意字符串
SELECT DISTINCT FROM SC WHERE GRADE<60;/*比较大小*/
SELECT SNAME FROM SC WHERE SAGE BETWEEN 20 AND 30;/*确定范围*/
SELECT Sname FROM SC WHERE Sdept IN('CS','MA','IS');/*确定集合*/
WHERE Sname NOT LIKE '刘%'; /*% 代表任意长度(长度可以为0)的字符串*/
WHERE Sname LIKE '欧阳__'; /*_代表单个字符*/
WHERE Cname LIKE 'DB\_Design' ESCAPE '\';
- 设计空值的查询,注意 Grade IS NULL 中 IS 不能用等号代替
WHERE Grade IS NULL;
# WHERE Grade IS NOT NULL;
- 多重条件查询
WHERE Sdept= 'CS' AND Sage<20;
ORDER BY
对查询结果按照一个属性或者多个属性列的升序ASC或者DESC降序排序,默认为__升序__
对于空值,排序时显示的次序是由具体系统来决定的
- 按升序排序,含空值的元组在最后显示
- 按降序排序,空值的元组最先显示
SELECT Sno, Grade
FROM SC
WHERE Cno= ' 3 '
ORDER BY Grade DESC;
聚集函数
聚集函数遇到空值时,除了
COUNT(*)
,其他都直接跳过。聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句。(不能用于WHERE子句)
SELECT COUNT(*) FROM Student;
SELECT COUNT(DISTINCT Sno) FROM SC;
SELECT AVG(Grade) FROM SC WHERE Cno= ' 1 ';
SELECT SUM(Ccredit) FROM SC,Course;
SELECT MAX(Grade) FROM SC WHERE Cno='1';
GROUP BY
GROUIP BY子句将查询结果按照某一列或者多列的值分组,值相等的为一组
SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno
查询选修相同Cno课程的同学总人数
SELECT FROM SC GROUP BY Sno HAVING COUNT(*)>3;
查询出元组个数>3,既学生选修的课程超过3门组选出来
连接查询
等值连接与非等值连接
SELECT Student.*,SC.* FROM Student,SC
WHERE Student.Sno=SC.Sno;
自然连接
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno;
复合条件
WHERE Student.Sno=SC.Sno AND SC.Cno=' 2 ' AND SC.Grade>90;
自身连接
连接操作对于自己和自己进行拼接,称为表的自身连接,取别名
SELECT FIRST.Cno, SECOND.Cpno
FROM Course FIRST, Course SECOND
WHERE FIRST.Cpno = SECOND.Cno;
外连接
仍将悬浮元组保存在结果关系中(会赋空值NULL)
# 左外连接
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUT JOIN SC ON (Student.Sno=SC.Sno);
多表连接
两个以上的表进行连接
嵌套查询
ORDER BY子句只能对最终查询结果排序
相关子查询和非相关子查询
SELECT Sno,Cno
FROM SC x
WHERE Grade>=(SELECT AVG(Grade)
FROM SC y
WHERE y.sno=x.sno
);
ANY、EXISTS相关子查询
SELECT Sname,Sage FROM Student
WHERE Sage<ANY(
SELECT Sage FROM Student WHERE Sdept='CS'
)
AND Sdept<>'CS'
SELECT Sname FROM Student
WHERE EXISTS(
SELECT * FROM Student WHERE Sno=Student.Sno AND Cno='1'
);
集合查询
集合操作主要包括并UNION、交INTERSECT、差EXCEPT
UNION:合并后会自动去除重复的元组
SELECT * FROM Student WHERE Sdept='CS' UNION SELECT * FROM Student WHERE Sage<=19;
SELECT * FROM Student WHERE Sdept='CS' INTERSECT SELECT * FROM Student WHERE Sage<=19;
SELECT * FROM Student WHERE Sdept='CS' EXCEPT SELECT * FROM Student WHERE Sage<=19;
数据更新
插入
- 插入元组
INSERT INTO SC(Sno,Cno) VALUES ('201908010808','1');
- 插入子查询结果
CREATE TABLE Dept_age(
Sdept CHAR(15),
Avg_age SMALLINT
);
INSERT INTO Dept_age(Sdept,Avf_age)
SELECT Sdept,AVG(Sage) FROM Student GROUP BY Sdept;
修改
- 修改某一元组
UPDATE Student SET Sage=22 WHERE Sno='201215121';
- 修改多个元组
UPDATE Student SET Sage=Sage+1;
- 带子查询的修改
UPDATE SC SET Grade=0 WHERE Sno IN(SELECT Sno FROM Student WHERE Sdept='CS')
删除
- 删除某一个元组值
DELETE FROM Student WHERE Sno='1';
- 删除多个元组值
DELETE FROM SC;
- 带子查询的删除
DELETE FROM SC WHERE Sno IN(SELECT Sno FROM Student WHERE Sdept='CS');
空值
不能取空值的约束条件
- NOT NULL约束条件的
- UNIQUE限制的属性
- 码属性
视图
视图是从一个或者几个基表中导出的表,与基表不同,这是一个虚表
数据库中只存放视图的定义,而不存放视图对应的数据
视图类似于一个窗口,如果基表发生改变,视图也会跟着发生变化
创建视图
CREATE VIEW IS_student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS'
WITH CHECK OPTION;
WITH CHECK OPTION
加上后,对于视图进行修改、插入和删除操作时,关系数据库会自动加上Sdept='IS'
的条件
行列子集视图:从单个基表中导出,并且只是去掉了基表中的某些行和某些列,但是保留了主码
分组视图:带有聚集函数和GROUP BY子句的查询来定义视图
删除视图
DROP VIEW IS_S1 CASCADE;
查询视图
视图消解
1:进行有效性检查,检查视图是否存在
2:从数据字典中取出视图定义,把定义的子查询和用户查询结合,转换成等价的对基本表的查询
3:执行修正了的查询
更新视图
更新视图:通过视图来插入、删除和修改数据
也是通过视图消解来转换为对基表的数据更新操作
视图作用
-
视图能简化用户操作
-
视图能使用户多种角度看待数据
-
视图对重构数据库提供了一定程度的逻辑独立性
-
视图能够对机密数据提供安全保护
-
视图可以更清晰表达查询
==数据物理独立性:==用户的应用程序不依赖于数据库的物理结构
==数据逻辑独立性:==当数据库重构时,增加新的关系或者对原先关系增加新的字段等,用户的应用程序不会受影响
比如新建视图是两个基表的自然连接的结果(这两个基表是由于重构而改变的),用户应用程序仍然能够用视图查找到数据
第四章:数据库安全性
数据库管理系统提供的安全技术为:强制存取控制、数据加密存储、加密传输等
身份鉴别机制
用户在进入系统中,系统对用户标识进行识别
存取控制
包括定义用户权限和合法权限检查
定义用户权限
用户对某一数据对象的操作权力称为权限,数据库管理系统提供了适合的语言来定义用户权限,这些定义经过编译后存储在数据字典中,被称为是安全规则或授权规则
合法权限检查
当用户发出存取数据库操作的请求后,数据库管理系统在系统内查找数据字典,根据安全规则进行合法权限检查
自主存取控制(DAC)
-
用户对不同的数据库对象有不同的存取权限
-
不同用户对同一对象也有不同的权限
-
用户可以将拥有的权限转给其他用户
用户自主地决定将数据存取权限授予何人,是否决定将“授权”权限赋予他人,这样地存取控制称为自主存取控制
强制存取控制(MAC)
每个数据库对象被标注一定的密级,每一个用户也被授予某一个级别的许可证,只有合法的用户才可以存取
分为主体和客体,为每个主体和客体分配一个敏感度标记(TS>=S>=C>=P)
-
当主体许可证级别大于等于客体密级时,主体才能够读取相应客体
-
当主体许可证级别小于等于客体密级时,主体才能够写相应客体
授权
GRANT:授予用户权限
REVOKE:回收用户权限
CASCADE或者RESTRICT,级联回收或者约束回收
WITH GRANT OPTION:被授权的用户能够传播该权限
GRANT ALL PRIVILEGES ON TABLE Student TO U2,U3;
GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTIONS;
新创建的用户只有三种权限:CONNECT、RESOURCE、DBA
角色
数据库角色是被命名的一组与数据操作相关的权限,角色是权限的集合
可以对一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权过程
作用:数据库角色是权限的集合,使用角色管理数据库权限可以简化授权过程,使自主授权执行的更加灵活和方便
一个角色的权限
- 直接授予这个角色的全部权限
- 其他角色授予这个角色的权限
视图机制
- 创建视图
- 赋予视图权限给相应用户(将保密的数据对无权存取的用户隐藏起来)
审计
审计功能是将用户对数据库的操作自动记录下来存放到审计日志中,利用审计日志来监控数据库中的各种行为,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、事件和内容等
AUDIT 设计审计功能,NOAUDIT语句取消审计功能
AUDIT ALTER,UPDATE ON SC;
NOAUDIT ALTER,UPDATE ON SC;
第五章:数据库完整性
实体完整性
- 检查主码是否唯一(通过B+树进行索引能大大提高效率)
- 检查主码各个属性是否为空
单属性码可以设置为列级约束条件和表级约束条件
CREATE TABLE SC(
Sno CHAR(9) PRIMARY KEY, /*列级主码*/
Ssex CHAR(2)
);
多属性码定义只能为表级约束条件
CREATE TABLE SC(
Sno CHAR(9) NOT NULL,
Cno CHAR(9) NOT NULL,
Ssex CHAR(2)
PRIMARY KEY(Sno,Cno) /*表级约束*/
);
参照完整性
对于参照完整性,除了定义外码,还应该定义外码是否允许空值
CREATE TABLE SC(
Sno CHAR(4) NOT NULL,
Cno CHAR(4) NOT NULL,
PRIMARY KEY(Sno,Cno),
FOREIGN KEY(Sno)REFERENCES Student(Sno) ON DELETE NO ACRION ON UPDATE CASCADE,
FOREIGN KEY(Cno)REFERENCES Course(Cno)
);
用户定义完整性
- 列值非空 (NOT NULL)
- 列值唯一(UNIQUE)
- 检查列值是否满足一个条件表达式(CHECK)
CREATE TABLE Student(
Sname CHAR(8) NOT NULL,
Sno CHAR(9) UNIQUE PRIMARY KEY,
SEX CHAR(2) CHECK (Ssex IN('男','女'))
);
完整性约束命名子句
CONSTRAINT : 用来对完整性约束条件命名
CREATE TABLE Student(
Sno NUMERIC(6) CONSTRAINT C1 CHECK (Sno BETWEEN 90 AND 900),
Sname CHAR(20) CONSTRAINT C2 NOT NULL,
CONSTRAINT StudentKey PRIMARY KEY(Sno)
);
断言
任何涉及断言的操作都会触发对断言的检查,如果不为真值操作就会被拒绝执行
CREATE ASSERTION C1 CHECK(
60>=ALL(SELECT COUNT(*)
FROM SC
GROUP by cno
)
);
DROP ASSERTION C1;
触发器
-
触发器规则:事件-条件-动作
事件发生,检查规则,执行动作
-
触发器只能定义在基本表上,不能定义在视图上
-
触发器类型
- 行级触发器 FOR EACH ROW(执行一次语句,按照行数触发器执行N次)
- 语句级触发器 FOR EACH STATEMENT(执行一次语句触发器执行一次)
第六章:关系数据理论
函数依赖
对于任意一个Y,在两个元组中不可能有两个相应的X属性相等
X函数确定Y、Y函数依赖于X : X → Y X\to Y X→Y
-
1NF:如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF
-
2NF:消除非主属性对码的部分函数依赖
若R∈1NF,且每一个非主属性完全函数依赖于任何一个候选码,则R∈2NF,
-
3NF:消除非主属性对码传递依赖
-
BCNF:在3NF基础上一个关系依赖里面每一个决定因素都包含码