点击下载PDF版(极力推荐)
前言
本文档是笔者脱离课堂教学实际、专为应试整理的资料,此为无奈之举。若时间充裕,建议先通过文档快速构建知识框架,再结合做题了解考查方式与范围,若仍觉需深入,可依文档索引结合课本细究;若时间有限,则以文档为核心复习,暂不深究课本细节。望大家合理利用文档备考,祝各位取得理想成绩!
By:ItsJiale
2025.5.28
第1章 绪论
第一章讲述的是需要知道了解的东西,第一遍学习清楚有关概念即可
I. 基本概念
名词对应
数据:Data
数据库:DataBase
数据库管理系统:DBMS
数据库系统:DBS
打个比喻,比如诉后菜鸟物流:
Data:快递
DB:物流仓库
DBMS:对应整个仓库的运作情况
DBS:对应整个物流系统 (宏观)
数据库管理系统的功能
- 数据定义功能
- 数据存储、组织、管理功能
- 数据操纵功能
- 数据库的事务管理和运行管理
- 数据库的建立和维护功能
- 其他功能
数据库系统的组成
- 数据库
- 数据库管理系统
- 应用程序
- 数据库管理员
II. 发展阶段
人工阶段
人工存储,没有共享,冗余大
数据不独立,完全依赖于程序
文件系统
数据管理者:文件系统,所有数据在操作系统中
特点:数据共享差、冗余度大、数据独立性差(存储行为仅仅为了某个应用)
数据库阶段
特点:
- 数据结构化
- 数据共享性高、冗余度低且易扩充
- 数据独立性高:
注:数据独立性包括逻辑独立性和物理独立性(后续有讲解),主要由数据库管理系统提供的二级映像来保证
- 数据由数据库管理系统统一管理和控制 :
数据库管理系统的数据控制功能: 1.数据的安全性保护 2.数据的完整性检查 3.并发控制 4.数据库恢复
III. 数据模型
数据模型是对世界数据特征的抽象,是数据库系统的核心和基础
数据模型的组成要素: (1)数据结构 (2)数据操作 (3)数据的完整性约束
数据模型分为概念模型和逻辑和物理模型
概念模型
E-R图
逻辑与物理模型
(1)层次模型(树)
跟树形结构相似,有双亲、根节点、兄弟节点
层次模型优点:(1)数据结构比较清晰(2)查询效率较高
(2)网状模型(数据结构的图)
类似于数据结构里面的图
网状模型优点:(1)更直接表现现实世界(2)存储(查询)效率高
(3)关系模型(表)(重点)
本质:一张二维表
相关术语:
(1)关系:一个关系就相当于一张表
(2)元组:表中的一行
(3)属性:一列是一个属性
(4)码:可以唯一确定的一个元组(比如说学号能确定学生),码不一定只有一个(学号和课程,可以确定成绩)
(5)域:是属性的取值范围(性别男或女)
(6)分量:元组中一个属性值(比如图中的黄大鹏就是分量)
(7)关系模式:是对关系的描述(比如说一个表里有什么属性:学号、姓名、年龄等)
关系模型的完整性约束:
(1)实体完整性:主码唯一确定且非空
(2)参照完整性:
学号 | 姓名 | 系编号 |
---|---|---|
2024001 | 张三 | 2 |
2024002 | 李四 | |
2024003 | 王五 | 1 |
2024004 | uAY0o | 3 |
系编号 | 系名 |
---|---|
1 | 计算机科学与技术系 |
2 | 交叉信息学研究院 |
3 | 深圳国际研究生院 |
这个具体例子是指系编号一定要在另一个表里要有,不能出现一个4,找不到里面的元素,但是可以为空
即,外码要么为空,要么在另一个表中为主码
(3)用户定义完整性:自定义的,比如性别为男或女
(4).面向对象数据模型
(5).对象关系模型
(6).半结构化数据模型
了解有个概念即可,重点是第三点
IV. 三级模式两级映像
外模式、模式、内模式(三级模式)
外模式模式映像、内模式模式映像(两级映像)
外模式可以有多个,模式和内模式只有一个
外模式
也称为子模式或者用户模式,是给用户用的
一个数据库可以有多个外模式
模式
也称为逻辑模式,专门管表的
它是独立的,改变之后是不会影响其他的部分
一个数据库只有一个模式
内模式
也称为存储模式,专门管存储的
一个数据库只有一个内模式
数据的独立性:包括物理独立性、逻辑独立性
逻辑独立性:当模式结构改变时,只要修改外模式/模式映像即可保持逻辑独立性
物理独立性:当内模式结构改变时,只需要修改内模式/模式映像即可保持物理独立性
V. 数据库系统的组成
数据库系统的组成: (1)硬件平台及数据库 (2)软件 (3)人员
人员包括:(1)数据库管理员 (2) 系统分析员和数据库设计人员
第2章 关系数据库
I. 关系模式
关系模式:对关系的描述
那什么是关系?
关系是一张表,一张二维表
关系有哪些需要描述?
(1)关系中的属性 (2)属性来自的域 (3)属性与域之间的映射关系
可以表示为:R(U,D,DOM,F)
R:关系名 U:所有的属性名 D:属性来自哪些域 DOM:属性与域之间的映射 F:属性之间的依赖关系
以上了解知道即可
II. 关系操作
关系操作:插入,查询、删除、修改
其中查询最为重要:选择、投影、连接、除法、并、差、交、笛卡尔积
其中基本操作为:选择、投影、并、差、笛卡尔积
III. 关系语言的分类
关系数据语言包括:(1)关系代数语言(2)关系演算语言 (不讲)(3)具有关系代数和关系演算的SQL语言
关系代数语言
(1)集合运算符
跟集合很像——交并补Venn图
这是两个表R和S
_R _x _S_笛卡尔积,类似于运动员握手的情况(比赛开始前,每个人都要和对方队员握手)
(2)选择
这是一个Student的表
下面是选择运算符
(3)投影
选择列的操作
(4)连接
连接分为自然连接、外连接、左外连接、右外连接
自然连接:共同的属性进行等值链接,在自然连接中被舍弃(没了被丢掉了)的元组称为悬浮元组(蓝色框)
外连接(R和S的悬浮元组均保留,蓝色框),左外连接(只保留左边的悬浮元组),右外连接(保留右边的悬浮元组)都是在自然连接的基础上,保留悬浮元组,如下图
(5)除法
除法运算是一种包含全体的运算 R/S (R是被除数,S是除数)
比如我想知道同时调剂志愿分别为深研院和贵系的同学
R
姓名 | 调剂志愿 |
---|---|
张三 | 贵系 |
张三 | 网研院 |
张三 | 深研院 |
王五 | 深研院 |
王五 | 贵系 |
uAY0o | 网研院 |
uAY0o | 贵系 |
S
调剂志愿 |
---|
深研院 |
贵系 |
R / S
姓名 |
---|
张三 |
王五 |
以上同学均有深研院和贵系的志愿才能被查到
R是红色的框,S是蓝色框
R/S得到选修了全部课程的学生号码,然后再做一个自然连接姓名
关系演算语言
不做讲解
SQL语言
第三章将会重点讲解
IV. 关系的完整性
实体完整性:主码唯一且非空
参照完整性:外码要么为空,要么就要对应另一个表的主码
用户定义完整性:自己定义的完整性
第3章 SQL语言
I. SQL特点
SQL包括:数据查询、数据操作、数据定义、数据控制,且SQL语言是非过程性语言(只需要指出需要什么信息,而不需要给出具体的操作步骤)
SQL的特点:
综合统一
把定义、修改、删除、连接、安全性、完整性、事物控制、动态SQL等统一起来
高度非过程化
层次模型和网状模型是过程化的,关系模型师非过程化的
面向集合的操作方式
以同一种语法提供给多种使用方式
既可以独立,也可以嵌入到Java、C++之中
语言简洁,易学易用
II. SQL的基本概念
SQL功能 | 动词 |
---|---|
数据查询 | SELECT(选择) |
数据定义 | CREATE,DROP,ALTER(对结构的创建、删除、修改) |
数据操纵 | INSERT,UPDATE,DELETE(对内容的插入、更新、删除) |
数据控制 | GRANT,REVOKE(权限控制) |
基本表:平时见到的二维表叫做基本表
存储文件:存储在数据库里的叫做存储文件
视图:是一个虚表,是从一个表中或多个表中导入出来的表(并不存真正的数据)
数据定义
操作对象 | 创建 | 删除 | 修改 |
---|---|---|---|
模式 | CREATE SCHEMA | DROP SCHEMA | |
表 | CREATE TABLE | DROP TABLE | ALTER TABLE |
视图 | CREATE VIEW | DROP VIEW | |
索引 | CREATE INDEX | DROP INDEX | ALTER INDEX |
(1)一个关系数据库管理系统(DBMS)的实例中可以建立多个数据库,一个数据库中可以建立多个模式(模式分为外模式、模式、内模式),一个模式下通常包括多个表、视图和索引等数据库对象
(2)索引:是为了加快我们的查询速度
(3)定义模式:【例】为用户WANG(登录数据库的账号)定义一个学生-课程表S-T
Create Schema"S-T" Authorization WANG;
(4)删除模式:Drop Schema<模式名><CASCADE | RESTRICT>
CASCADE表示级联,把模式下的表和视图全部删除
RESTRICT表示限制,如果模式下面有表和视图,则停止执行该语句
(5)基本表的定义、修改、删除
【例】建立一个学生表Student和课程表Course
Create table Student
(Sno CHAR(9) Primary Key, //设置为主码
Sname CHAR(20) Unique, //不允许重复
Sex CHAR(2),
Sage Smallint,
Sdept CHAR(20)
);
<font style="color:rgb(28, 31, 35);">Create table Course </font>
<font style="color:rgb(28, 31, 35);">( Cno CHAR(4) Primary Key, </font>
<font style="color:rgb(28, 31, 35);"> Cname CHAR(40) NOT NULL, </font>
<font style="color:rgb(28, 31, 35);"> Pno Char(4),</font>
<font style="color:rgb(28, 31, 35);"> Ccredit Smallint, </font>
<font style="color:rgb(28, 31, 35);"> Foreign Key (Cpno) References Course(Cno); //参照完整性,Cpon是外码,被参照列式Cno</font>
(6)数据类型
(7)修改基本表
【例】向Student表中增加“入学时间”列,其数据类型为日期型
ALTER table Student ADD S_entrance DATE;
【例】将年龄的数据类型由字符串型(假设原来是字符串型)改为整数
ALTER table Student ALTER COLUMN Sage INT;
【例】增加课程名称必须取唯一值的约束条件
ALTER table Course ADD UNIQUE(Cname);
(8)删除基本表:DROP TABLE<表名>[RESTRICT | CASCADE]
RESTRICT一旦有依赖就删不掉(不能有视图,不能有触发器,不能有存储过程或函数)
CASCADE全部删除
(9)索引的建立和删除
索引是为了加快查询的速度
CREATE UNIQUE INDEX Stusno(索引名) ON Student(Sno);
CREATE UNIQUE INDEX Coucno(索引名) ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC, Cno DESC);
Sno 列按照升序排列(ASC 表示升序),Cno 列按照降序排列(DESC 表示降序)
【例】将SC表的SCno索引名改为SCSno
ALTER INDEX SCno RENAME TO SCSno;
【例】删除Student表中的Stusname索引
DROP INDEX Stusname;
(10)数据字典:数据字典是DBMS内部的系统表,他记录了数据库中的所有的定义信息(比如三级模式两级映像)
数据查询(重点)
A. 基本查询
学号Sno | 姓名Sname | 性别Ssex | 年龄Sage | 所在系Sdept |
---|---|---|---|---|
2024001 | 李勇 | 男 | 22 | 求真书院 |
2024002 | 张三 | 男 | 18 | 网络科学与网络空间研究院 |
2024003 | 李四 | 男 | 23 | 计算机科学与技术系 |
2024004 | 王敏 | 女 | 20 | 深圳国际研究生院 |
(1)【例】查询Sname,Sno,Sdept的记录
SELECT Sname,Sno,Sdept from Student;
(2)【例】查询全体学生的详细记录
SELECT * from Student;
(3)还可以在查询过程中加入一个表达式
SELECT Sname,2014-Sage from Student;
(4)在查询的列进行重合名
<font style="color:rgb(28, 31, 35);">SELECT Sname NAME,2014-Sage BIRTHDAY, LOWER(Sdept) DEPARTMENT FROM Student; // LOWER把所有的字母都变成小写</font>
(5)取消重复值
SELECT **Distinct** Sno FROM SC;
B. 条件查询
(1)WHERE
【例】查询计算机科学与技术系的全体学生的名单
SELECT Sname FROM Student WHERE Sdept="cs";
【例】查询所有年龄在20岁以下的学生姓名及其年龄
SELECT Sname,Sage FROM Student WHERE Sage<20;
【例】查询所有年龄在20到23岁之间的学生
SELECT Sname,Sdept,Sage FROM Student WHERE Sage between 20 and 23;
【例】查询计算机科学与技术系CS,数学系MA和信息系IS学生的姓名和性别
SELECT Sname,Ssex FROM Student WHERE Sdept **IN**('CS','MA','IS');
IN 只要有一门符合就行
(2)LIKE 模糊匹配
%(百分号)代表任意长度(长度可以为0)的字符串。例如a%b表示以a开头,以b结尾的任意长度的字符串。如acb、addgb、ab等都满足该匹配串。
_(下横线)代表任意单个字符。 例如a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb、afb等都满足该匹配串。
【例】 查询所有姓刘的学生的姓名、学号和性别
<font style="color:rgb(28, 31, 35);">SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE '刘%'; </font>
【例】查询姓“欧阳”且全名为三个汉字的学生的姓名
<font style="color:rgb(28, 31, 35);">SELECT Sname FROM Student WHERE Sname LIKE '欧阳_'; </font>
当需要匹配的字符里面有下划线_ ,就需要进行转义字符 \ ,且末尾增添 ESCAPE '\'
【例】查询课程名为DB_Design的课程的课程号和学分
<font style="color:rgb(28, 31, 35);">SELECT Cno,Ccredit FROM Course WHERE Cname LIKE 'DB\_Design' ESCAPE '\';</font>
(3)涉及空值问题
<font style="color:rgb(28, 31, 35);">SELECT Sno, Cno FROM SC WHERE Grade </font>**<font style="color:rgb(28, 31, 35);">IS</font>**<font style="color:rgb(28, 31, 35);"> NOT NULL;</font>
IS NULL / IS NOT NULL
(4)多重条件查询
【例】 查询计算机科学系年龄在20岁以下的学生姓名
<font style="color:rgb(28, 31, 35);">SELECT Sname FROM Student WHERE Sdept='CS' AND Sage<20; </font>
AND 的意思是 左右两边都必须符合
OR 的意思是左右两边有一个符合即可
(5)ORDER BY
对查询结果进行排序 用ORDER BY
按照成绩 进行降序排序
<font style="color:rgb(28, 31, 35);">SELECT Sno, Grade FROM SC WHERE Cno="3" ORDER BY Grade DESC;</font>
升序排序 把 DESC 去掉 默认就是升序
【例】查询结果按所在系的系号升序排序,同一系的学生按年龄降序排列
SELECT * FROM Student ORDER BY Sdept, Sage DESC;
(6)聚合函数
COUNT(*) 统计元组个数
COUNT([DISTINCT|ALL] <列名>) 统计一列中值的个数
SUM([DISTINCT|ALL] <列名>) 计算一列值的总和(此列必须是数值型)
AVG([DISTINCT|ALL] <列名>) 计算一列值的平均值(此列必须是数值型)
MAX([DISTINCT|ALL] <列名>) 求一列值中的最大值
MIN([DISTINCT|ALL] <列名>) 求一列值中的最小值
返回值是数字!
【例】查询学生总人数。
<font style="color:rgb(28, 31, 35);">SELECT COUNT(*) FROM Student; </font>
【例】 查询选修了课程的学生人数。
<font style="color:rgb(28, 31, 35);">SELECT COUNT(DISTINCT Sno) FROM SC; </font>
学生每选修一门课,在SC中都有一条相应的记录。一个学生要选修多门课程,为避免重复计算学生人数,必须在COUNT函数中用DISTINCT短语。
【例】 计算选修1号课程的学生平均成绩。
<font style="color:rgb(28, 31, 35);">SELECT AVG(Grade) FROM SC WHERE Cno='1'; </font>
【例】 查询选修1号课程的学生最高分数。
<font style="color:rgb(28, 31, 35);">SELECT MAX(Grade) FROM SC WHERE Cno='1'; </font>
(7)GROUP BY 聚合函数
GROUP BY 进行分类汇总
【例】 求各个课程号及相应的选课人数。
<font style="color:rgb(28, 31, 35);">SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno; </font>
Cno | COUNT(Sno) |
---|---|
1 | 22 |
2 | 34 |
3 | 33 |
4 | 48 |
依据Cno进行分类,对Sno进行总和
==>用 Having 对GROUP BY的结果再筛选
SELECT Cno,Count(Sno) FROM SC GROUP BY Cno Having Count(Sno)>35;
Cno | COUNT(Sno) |
---|---|
3 | 44 |
4 | 48 |
C. 多表连接查询
通过观察可以发现,只有绿色的框框是有意义的
因此,我们需要剔除没用的部分
我们再次观察发现,有用的部分都是_A的学号和B的学号相等_
SELECT * from A,B where A.学号 = B.学号;
我们再次注意到,其实B学号这一列是无用的
SELECT A.学号,姓名,班级,课程,成绩 from A,B where A.学号 = B.学号;
如果此时我们要筛选条件,则
SELECT A.学号,姓名,班级,课程,成绩 from A,B where A.学号 = B.学号 and 成绩>80;
左外连接与右外连接
D. 嵌套查询
Student表
学号Sno | 姓名Sname | 性别Ssex | 年龄Sage | 所在系Sdept |
---|---|---|---|---|
2024001 | 李勇 | 男 | 22 | 求真书院 |
2024002 | 张三 | 男 | 18 | 网络科学与网络空间研究院 |
2024003 | 李四 | 男 | 23 | 计算机科学与技术系 |
2024004 | 王敏 | 女 | 20 | 深圳国际研究生院 |
SC表
学号Sno | 课程号Cno | 成绩Grade |
---|---|---|
2024001 | 1 | 92 |
2024001 | 2 | 88 |
2024002 | 2 | 100 |
2024002 | 3 | 90 |
查询结果如下
姓名Sname |
---|
李勇 |
张三 |
E. 存在EXISTS
在关系代数中,我们介绍了除法
除法:选择某一全体
Student表 (A)
学号Sno | 姓名Sname | 性别Ssex | 年龄Sage | 所在系Sdept |
---|---|---|---|---|
2024001 | 李勇 | 男 | 22 | 求真书院 |
2024002 | 张三 | 男 | 18 | 网络科学与网络空间研究院 |
2024003 | 李四 | 男 | 23 | 计算机科学与技术系 |
2024004 | 王敏 | 女 | 20 | 深圳国际研究生院 |
SC表(B)
学号Sno | 课程号Cno | 成绩Grade |
---|---|---|
2024001 | 1 | 92 |
2024001 | 2 | 88 |
2024002 | 2 | 100 |
2024002 | 3 | 90 |
Course表(C)
课程号Cno | 课程名Cname | 先行课Cpno | 学分Ccredit |
---|---|---|---|
1 | 数据结构DSA | 5 | 4 |
2 | 操作系统OS | 3 | |
3 | 机器学习 | 1 | 3 |
4 | 计算机网络 | 6 | 2 |
5 | 计算机组成原理 | 7 | 3 |
6 | 数据分析 | 2 | |
7 | JavaEE | 6 | 4 |
【例】查找选修了所有课程的学生的姓名(难)
A-->Student表 B-->SC表 C-->Course表
F. 集合查询
并集
【例】使用 UNION 操作符查询选修课程 1 或课程 2 的学生
<font style="color:rgb(28, 31, 35);">SELECT Sno FROM SC WHERE Cno='1' </font>**<font style="color:rgb(28, 31, 35);">UNION</font>**<font style="color:rgb(28, 31, 35);"> SELECT Sno FROM SC WHERE Cno='2';</font>
交集
【例】使用 INTERSECT 操作符查询计算机系且年龄不大于 19 岁的学生
<font style="color:rgb(28, 31, 35);">SELECT * FROM Student WHERE Sdept='CS' </font>**<font style="color:rgb(28, 31, 35);">INTERSECT</font>**<font style="color:rgb(28, 31, 35);"> SELECT * FROM Student WHERE Sage<=19;</font>
差集
【例】查询计算机科学系的学生与年龄不大于 19 岁的学生的差集。 <font style="color:rgba(0, 0, 0, 0.85);">SELECT *</font> <font style="color:rgba(0, 0, 0, 0.85);">FROM Student</font> <font style="color:rgba(0, 0, 0, 0.85);">WHERE Sdept='CS'</font> **<font style="color:rgba(0, 0, 0, 0.85);">EXCEPT</font>**** **<font style="color:rgba(0, 0, 0, 0.85);">SELECT *</font> <font style="color:rgba(0, 0, 0, 0.85);">FROM Student</font> <font style="color:rgba(0, 0, 0, 0.85);">WHERE Sage <=19;</font>
数据更新
A. 数据插入
INSERT
INTO 表名 (属性1,属性2,属性3......)
VALUES(属性1的值,属性2的值,属性3的值......);
可以把SELECT查询的结果插入表中
B. 修改语句
UPDATE 表名
SET 属性=新的值;
后面可以加(WHERE精确查找)
数据控制
GRANT REVOKE 下一章讲解
III. SQL的基本语法
视图
视图是一种虚表,它的真正的数据存在于基本表上
(1)创建视图
(很讨厌课本这种又臭又长的描述)
【例】
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept="CS" //CS是这个系的学生
**WITH CHECK OPTION;**
为什么增加WITH CHECK OPTION
课本原话:为了防止用户通过视图对数据进行增加、删除、修改时吗,有意无意地对不属于视图范围内的基本表数据进行操作,可在定义视图时加上WITH CHECK OPTION子句。这样在视图上增删改数据时,关系数据库管理系统会检查视图定义的条件,若不满足则拒绝执行该操作
若一个视图时从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,则称这类视图为行列子集视图
并不是所有的视图都是可以更新的,行列子集视图是可以更新的
其他的有些视图也可以更新,但是没有办法对它进行分类
(2)删除视图
DROP VIEW 视图名 CASCADE(级联)
视图删除后视图的定义将从数据字典中删除,如果该视图上还导出了其他视图,则使用CASCADE级联全部视图一起删除
(3)视图的作用
- 可以简化操作
- 可以用不同角度看待同一数据
- 提供一定程度的逻辑独立性
- 能够提供安全性保护
- 适当利用视图可以更清晰表达查询
第4章 数据库安全性
I. 数据库安全性概述
不安全因素:
(1)非授权用户对数据库的恶意存取和破坏
(2)数据库中重要的数据被泄露
(3)安全环境的脆弱性
II. 数据库安全性控制
用户身份识别
静态口令鉴别
动态口令鉴别
生物特征鉴别
智能卡鉴别
存取控制
(1)定义用户权限,并将用户权限登记到数据字典中
(2)合法权限检查
自主存取控制方法
存取控制的对象不仅有数据本身(基本表中的数据、属性列上的数据),还有数据库模式(包括数据库、基本表、视图和索引的创建等)
授权:授予与收回
(1)GRANT
把增加删除修改的权力授权给用户
<font style="color:rgba(0, 0, 0, 0.85);">GRANT 权限1,权限2... ON 对象类型 对象名 TO 用户1,用户2... [WITH GRANT OPTION];</font>
【例】 <font style="color:rgb(28, 31, 35);">GRANT SELECT ON TABLE Student TO U1; </font>
==>把Student表上的SELECT权限给U1这个用户
【例】<font style="color:rgb(28, 31, 35);">GRANT all privileges ON TABLE Student, Course TO U2,U3;</font>
==>把Student表和Course表的全部操作权限授予用户U2和U3
【例】<font style="color:rgb(28, 31, 35);">GRANT SELECT ON TABLE SC TO PUBLIC; </font>
==>把表SC的查询权限授予所有用户
【例】<font style="color:rgb(28, 31, 35);"> GRANT UPDATE(Sno),SELECT ON TABLE Student TO U4; </font>
==>把Student表修改学生学号和选择的权限授给用户U4
末尾加上<font style="color:rgba(0, 0, 0, 0.85);">WITH GRANT OPTION</font>
即为这个用户还可以给别人授权
(2)REVOKE
收回权限
<font style="color:rgba(0, 0, 0, 0.85);">REVOKE 权限1,权限2... ON 对象类型 对象名 FROM 用户1,用户2... [CASCADE|RESTRICT];</font>
【例】 把用户U4修改学生学号的权限收回。
<font style="color:rgb(28, 31, 35);">REVOKE UPDATE(Sno) ON TABLE Student FROM U4; </font>
【例】 收回所有用户对表SC的查询权限。
<font style="color:rgb(28, 31, 35);">REVOKE SELECT ON TABLE SC FROM PUBLIC; </font>
【例】 把用户U5对SC表的INSERT权限收回。
<font style="color:rgb(28, 31, 35);">REVOKE INSERT ON TABLE SC FROM U5 CASCADE; </font>
U5-->U6-->U7 授权顺序
加上<font style="color:rgb(28, 31, 35);">CASCADE</font>
级联时也会把U5,U6,U7的权限收回
数据库角色
角色指的是一类人,比如说教师,学生,家长,可以给这一类人授权
之前所讲的是用户,一个用户可以扮演很多角色
(1)角色的创建
CREATE ROLE 角色名;
(2)给角色授权
GRANT 权限 ON TABLE 表名 TO 角色名;
(3)将一个角色授予其他的角色或用户
GRANT 角色 TO 用户1,用户2.....;
在这个角色里面添加用户
III. 视图机制
为不同的用户定义不同的视图,把不需要的数据给隐藏起来,这样用户就不会进行错误操作
视图前面已讲
IV. 审计
把对数据库的所有操作都记录到审计日志中,然后就可以通过日志审查这个里面是否有一些非法的行为
V. 数据加密
通过一些加密算法,把明文变成密文,这样别人就无法查看
第5章 数据库完整性
I. 正确性、相容性
数据的正确性是指数据是符合现实世界语义、反映当前实际状况的
数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的
为维护完整性,需要实现如下功能
(1)提供定义完整性约束条件的机制
(2)提供完整性检查的方法
(3)进行违约处理
II. 三大完整性
此前均有提及
实体完整性
主码唯一且非空
参照完整性
外码要么为空,要么就是对应另外一张表的主码
用户定义完整性
属性上约束条件的定义
(1)非空NOT NULL
(2)列值唯一 UNIQUE
(3)满足某一条件表达式 CHECK
比如年龄必须要18~20岁,性别只能男或女
实现方法有三种:(1)CHECK(2)断言(3)触发器
III. CHECK
在创建的时候用CHECK方法约束
CREATE table Student
(
Sno char(8),
Sname char(8) NOT NULL,
Ssex char(2),
check(Ssex="女" or Sname Not like "张%") //性别一定是为女或者姓名不能为张
);
也还可以constraint语句
<font style="color:rgb(28, 31, 35);">CREATE TABLE Student </font>
<font style="color:rgb(28, 31, 35);">(</font>
<font style="color:rgb(28, 31, 35);">Sno NUMERIC(6) </font>
<font style="color:rgb(28, 31, 35);">CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999), //C1是它的别名</font>
<font style="color:rgb(28, 31, 35);">Sname CHAR(20) </font>
<font style="color:rgb(28, 31, 35);">CONSTRAINT C2 NOT NULL, </font>
<font style="color:rgb(28, 31, 35);">Sage NUMERIC(3) </font>
<font style="color:rgb(28, 31, 35);">CONSTRAINT C3 CHECK (Sage < 30), </font>
<font style="color:rgb(28, 31, 35);">Ssex CHAR(2) </font>
<font style="color:rgb(28, 31, 35);">CONSTRAINT C4 CHECK (Ssex IN ('男','女')), </font>
<font style="color:rgb(28, 31, 35);">CONSTRAINT StudentKey PRIMARY KEY(Sno) </font>
<font style="color:rgb(28, 31, 35);">);</font>
IV. 断言
断言也是实现用户定义完整性的,只是功能比Check更加多样
创建断言
create assertion 断言名 check子句;
【例】数据库中最多有60名学生选修
create assertion 断言名
check(
60 >= select count(*) from 表名
);
删除断言
drop assertion 断言名
V. 触发器(重点)
触发器:用户定义在关系表上一类由事件驱动的特殊过程(比断言更高级)
创建触发器的格式
create trigger 触发器名 before/after 触发事件 on 表名
Referencing New/Old Row as 变量
for each ROW/Statement //ROW是修改一行就触发一次 Statement是修改整个表才触发
[When 触发条件](可以选择不要) 触发动作体
当上述条件满足时才能调用触发器(知道大概即可,下面会有例子讲解)
(1)触发器名:同一模式下,触发器名必须是唯一的,并且触发器名和表名必须在同一模式下
(2)表名:触发器只能定义在基本表上,不能定义在视图上
(3)触发事件:可以是INSERT、DELETE或者UPDATE,也可以是这几个事件的组合,before/after是指(以插入为例)是插入前调用还是插入后调用
(4)触发器类型:可以分为行级触发器(FOR EACH ROW 有几行就触发几次)和语句级触发器(FOR EACH STATEMENT)
(5)触发条件:只有当WHEN触发条件为真的时候才执行,否则不执行
【例】 当对表 SC 的 Grade 属性进行修改时,若分数增加了 10%,则将此次操作记录到另一个表 SC_U(Sno、Cno、Oldgrade、Newgrade)中,其中 Oldgrade 是修改前的分数,Newgrade 是修改后的分数。 <font style="color:rgba(0, 0, 0, 0.85);">CREATE TRIGGER SC_T //</font>_<font style="color:rgb(0, 0, 0) !important;">SC_T 是触发器的名字</font>_
<font style="color:rgba(0, 0, 0, 0.85);">AFTER UPDATE OF Grade ON SC //</font>_<font style="color:rgb(0, 0, 0) !important;">UPDATE OF Grade ON SC 是触发事件,</font>_
<font style="color:rgba(0, 0, 0, 0.85);">//</font>_<font style="color:rgb(0, 0, 0) !important;">AFTER 是触发的时机,表示当对 SC 的 Grade 属性修改完后再触发下面的规则</font>_<font style="color:rgba(0, 0, 0, 0.85);">/</font>
<font style="color:rgba(0, 0, 0, 0.85);">REFERENCING</font>
<font style="color:rgba(0, 0, 0, 0.85);">OLDROW AS OldTuple,</font>
<font style="color:rgba(0, 0, 0, 0.85);">NEWROW AS NewTuple</font>
<font style="color:rgba(0, 0, 0, 0.85);">FOR EACH ROW //</font>_<font style="color:rgb(0, 0, 0) !important;">行级触发器,即每执行一次 Grade 的更新,下面的规则就执行一次</font>_
<font style="color:rgba(0, 0, 0, 0.85);">WHEN (NewTuple.Grade >= 1.1 * OldTuple.Grade) //</font>_<font style="color:rgb(0, 0, 0) !important;">触发条件,只有该条件为真时才执行</font>_
<font style="color:rgba(0, 0, 0, 0.85);">//如果分数增加10%,就把信息存到SC_U表中</font>
<font style="color:rgba(0, 0, 0, 0.85);">INSERT INTO SC_U (Sno,Cno,OldGrade,NewGrade) //</font>_<font style="color:rgb(0, 0, 0) !important;">下面的 insert 操作</font>_<font style="color:rgba(0, 0, 0, 0.85);"></font>
<font style="color:rgba(0, 0, 0, 0.85);">VALUES(OldTuple.Sno,OldTuple.Cno,OldTuple.Grade,NewTuple.Grade)</font>
SC表
Sno | Cno | Grade |
---|---|---|
121 | 1 | 92 |
121 | 2 | 85 |
122 | 3 | 88 |
122 | 2 | 90 |
122 | 3 | 80 |
若我要执行update SC set Grade = Grade*1.2 where Sno=121 and Cno=2;
那标注黄色的就是oldROW
SC表
Sno | Cno | Grade |
---|---|---|
121 | 1 | 92 |
121 | 2 | 102 |
122 | 3 | 88 |
122 | 2 | 90 |
122 | 3 | 80 |
现在分数从85-->102了 这一行也就是NewRow
激活触发器
如果一个表定义了多个触发器,如多个before触发器、多个after触发器,则同一个表上的触发器激活时遵循如下执行顺序:
(1)执行该表上的BEFORE触发器
(2)激活触发器的SQL语句
(3)执行该表上的AFTER触发器
对于同一个表上的多个BEFORE(AFTER)触发器,遵循“谁先创建谁先执行”的原则,即按照触发器创建的时间先后顺序执行
删除触发器
DROP trigger 触发器名 on 表名;
第6章 关系数据理论
I. 存在的问题
关系模式存在以下问题
数据冗余
比如姓名重复出现,浪费空间
更新异常
更新后造成数据不一致,比如班主任换个名字,每个学生对应的每行都得更换
插入异常
应该插入的无法被插入,比如系刚成立,无法插入数据
删除异常
不该删除的被删除,比如学生毕业,老师对应的信息也没了
II. 规范化-几个范式
函数依赖
X:班级 Y:你
举个例子:你不在这个班中,也就能把你找到——非平凡的函数依赖
举个例子:你在这个班中,只要给整个班的名单,就一定能把你找到——平凡的函数依赖
部分函数依赖:比如说学号能-->姓名,而学号+班级号也能-->姓名,但是只通过学号就能-->姓名,因此姓名对学号+班级号是部分函数依赖
码
(1)候选码
有这样的一个集合,他可以推出所有的属性,但是他的任意一个真子集无法推出所有属性,叫做候选码
【例】有一个依赖 F={A->B, B->C ,D->E} (中文意思就是A能推出B,B能推出C,D能推出E)
这里的候选码是AD,因为AD可以推出所有的属性(A能推出B,B能推出C,所以A能推出ABC;D能推出E;因此AD能推出全部属性),但是AD的真子集(真子集:A ,D)都无法单独推出所有属性
一个F中可以有多个候选码,候选码不唯一
【例】F={A->B, B->C ,D->E, E->D}
这里面AD可以推出所有属性,AE也可以推出所有属性,所以候选码是AD,AE
【题】求出下列F的候选码
R<U,F>, U=(A,B,C,D,E,G), F={AB-->C, CD-->E, E-->A, A-->G}求候选码
(U是所有属性包括ABCDEG)
步骤:(把推出的顺序按竖写下来,序号代表行数)
1 AB-->C
2 CD-->E
3 E-->A
4 A-->G
Step1:只出现在左边的一定是候选码
Step2:只出现在右边的一定不是候选码
Step3:左右都出现的不一定是候选码
Step4:左右都不出现的一定是候选码
什么意思呢,解释一下:
A左边出现(第一行,第四行),右边也出现了(第三行),所以A不一定是候选码
B只在左边出现(第一行),所以B一定是候选码
C在左边出现(第二行),也在右边出现(第一行),所以C不一定是候选码
D只在左边出现(第二行),所以D一定是候选码
E左边出现(第三行),右边也出现(第二行),所以E不一定是候选码
G只在右边出现(第四行),所以G一定不是候选码
因此,一定是候选码的是BD,可能是候选码的是ACE,一定不是候选码的是G
闭包:BD的闭包是指由BD能推出来的所有属性
再求一下BD的闭包:
第一行BD不能推出C,因此它(BD)没有A
第二行BD不能推出E,因为它(BD)没有C
所以发现BD都推不出来,表示为(BD)+= BD,因此BD并不是全体,然后就把可能的候选码(ACE)每一个都添加进去:
(ABD)+= ABCDEG
(BDC)+= ABCDEG
(BDE)+= ABCDEG
综上,候选码为ABD,BDC,BDE
如果加了可能的还是推不出来,就再加上剩下的(本题没有涉及),直到有一个能把它所有属性推出来的
下面用例子讲解一下闭包的求法:
【例】设关系模式R(A,B,C,D),F是R上成立的FD集,F={A-->B,B-->C},求(BD)+、(B)+ 就是闭包的意思
由于上标+号不太容易排格式,于是下面省略+号
对于(BD)+
解法:首先把BD写出来(不带括号,带括号和+的是闭包的意思),看F中的左边,找左侧有B、D、BD的,这里有一个B-->C,所以BD就可以写成BDC,然后看F的左边含有BDC的,是不是没有了,所以(BD)+就是BDC
对于(B)+
解法:首先把B写出来,看F的左边,找到有B的,这里是B-->C,所以B就可以写成BC,然后看F的左边含有BC的,是不是没有了,所以(B)+就是BC
(2)超码
能推出所有属性的属性集,且他的任意一个真子集是可以推出所有属性的,叫做超码
比如上题的(ABD)是候选码,超码可以是(ABCD)、(ABCDE)等
候选码是最小的超码
(3)主码
从候选码中任意挑一个
(4)主属性
包含在任意一个候选码中的属性,叫做主属性,上题的主属性为ABCDE(候选码的全部包含在)
(5)非主属性
不包含在候选码中的属性,上题为G
(6)码
主码和候选码都简称为码,其实就是主属性,给了个新的名字
(7)全码
当关系模式的候选码包含全部属性时,该候选码称为全码。此时,所有属性均为候选码的成员,因此全部是主属性。
范式
(1)1NF—第一范式
所有关系模式都满足1NF,1NF的要求就是表中无表
(2)2NF—第二范式
在1NF的基础上,_不存在_非主属性对码(主属性)的部分函数依赖
红色的框是体现了部分函数依赖,因此上述不属于2NF
可以把这一行拆为R1(Sno, Sdept, Sloc) R2(Sno, Cno, Grade)
(3)3NF—第三范式
在2NF的基础上,不存在非主属性对码的传递函数依赖
学号 | 姓名 | 班级号 | 班级名 |
---|---|---|---|
1 | 张三 | 206 | 计科 |
2 | 李四 | 217 | 软工 |
学号->姓名 学号->班级号 班级号->班级名 (这就是传递函数依赖)
因此上述不属于3NF
可以拆为R1(学号,姓名,班级号) R2(班级号,班级名)
为什么全码一定是3NF
——>全码里面没有非主属性,所以全码一定是3NF
(4)BCNF
在3NF的基础上,不存在主属性对码的部分函数依赖和传递函数依赖
(学生,课程)-->名次
(课程,名次)-->学生
因为(学生,课程)的任何一个子集都推不出名次,同理(课程,名次)任何一个子集也推不出学生,所以不存在部分函数依赖,这里也没有传递函数依赖
III. 数据依赖的公理系统
(1)Armstrong公理系统
A1 自反律 就是大推出小
A2 增广律 就是在能X-->Y的前提下 加上一个任意的属性
A3 传递律 顾名思义就是传递 X-->Y,Y-->Z,则X-->Z
合并规则: X-->XZ(增广律),X-->Y 所以XZ-->YZ(增广律) 通过传递X-->YZ
伪传递规则:XW-->YW,YW-->Z 传递XW-->Z
分解规则:Z∈Y,Y-->Z 传递X-->Z
(2)最小函数依赖集
F中的每一个依赖,都不可以被其他的依赖推出,且右边一定是单元素_(这里就是只有单个字母)_
F={A-->B,B-->A,B-->C,A-->C,C-->A}
这不是一个最小函数依赖集,因为A-->C可以由A-->B,B-->C推出,其实就是A-->C就是没有意义的
【题】求出下列的最小依赖集,F={A-->B,B-->A,B-->C,A-->C,C-->A}
Step1:把右边的元素拆分成单个的
该题目右边都是单个的,所以不用拆
若F={A-->BC,B-->D}
所以要拆成A-->B,A-->C,B-->D
Step2:把所有的依赖,找出多余的(就像抓犯人,一个个审问)
排查A-->B: 把A-->B去掉,那么F={B-->A,B-->C,A-->C,C-->A}
然后求(A)+ =AC (省略求闭包的过程),不包含B,所以嫌疑排除,保留
排查B-->A:把B-->A去掉,那么F={A-->B,B-->C,A-->C,C-->A}
然后求(B)+=BCA,包含A,就是嫌疑人,剔除
排查B-->C:把B-->C去掉,那么F={A-->B,B-->A,A-->C,C-->A}
然后求(B)+=B,不包含C,所以嫌疑排除,保留
排查A-->C:把A-->C去掉,那么F={A-->B,B-->A,B-->C,C-->A}
然后求(A)+=ABC,包含C,就是嫌疑人,剔除
排查C-->A:把C-->A去掉,那么F={A-->B,B-->A,B-->C,A-->C}
然后求(C)+=C,不包含A,所以嫌疑排除,保留
最终Fmin={A-->B,B-->C,C-->A}
事实上,由于我们的排查顺序不同,我们的最小函数依赖集可能也不唯一,我们既可以从前往查,也可以从后往前查
IV. 模式的分解
模式分解有两个准则:(1)无损连接性(2)保持函数依赖
无损分解,就是分解之后,能够通过自然连接结合起来
保持函数依赖,就是F分解之后。能够通过自然连接结合起来
F={学号-->院系,院系-->专业}
学号 | 院系 | 专业 |
---|---|---|
1 | 自动化系 | 大数据工程 |
2 | 深圳国际研究生院 | 计算机应用技术 |
3 | 计算机科学与技术系 | 计算机科学与技术 |
4 | 网络科学与网络空间研究院 | 网络安全 |
这样一个表,是存在传递函数依赖的
学号-->院系,院系-->专业
如果我们这么拆解
学号 |
---|
1 |
2 |
3 |
4 |
院系 |
---|
自动化系 |
深圳国际研究生院 |
计算机科学与技术系 |
网络科学与网络空间研究院 |
专业 |
---|
大数据工程 |
计算机应用技术 |
计算机科学与技术 |
网络安全 |
这样分解,显然有一个问题,就是我们并不知道学号1的同学在哪个院系,通过自然连接也无法恢复,这就是损失分解
如果我们这么分解
学号 | 院系 |
---|---|
1 | 自动化系 |
2 | 深圳国际研究生院 |
3 | 计算机科学与技术系 |
4 | 网络科学与网络空间研究院 |
学号 | 专业 |
---|---|
1 | 大数据工程 |
2 | 计算机应用技术 |
3 | 计算机科学与技术 |
4 | 网络安全 |
这样分解,还是有问题,就是我们并不清楚专业对应的院系是哪里了,所以就不保持函数依赖了
如何把数据库分解成3NF,并且保持无损分解和函数依赖
Step1:求出最小函数依赖集
Step2:把不在F中的属性找出来,单独分为一类,并且从这些属性删除
Step3:每一个依赖左边相同的分为一类
Step4:如果候选码没有出现在分类中,把任意一个候选码作为一类
【题】已知R(ABCDEGH),F={A-->D,E-->D,D-->B,BC-->D,DC-->A}
求出最小函数依赖集Fmin={A-->D,E-->D,D-->B,BC-->D,DC-->A}
由于GH没有出现在F中,所以单独放在一类{GH}并且先从R中删除
现在R中只剩下了(ABCDE)
剩下的根据依赖左边相同的放在一类
什么情况是左边一样的?
Fmin={A-->B,A-->C.....}
所以左边一样的{ABC}
{AD}(只有第一组A-->D的左边是A,所以AD为一类)
{ED}(只有第二组E--> D的左边是E,所以ED为一类)
{DB}(只有第三组D-->B的左边是D,所以DB为一类)
{BCD}(只有第四组BC-->D的左边是BC,所以BCD为一类)
{DCA}(只有第五组DC-->A的左边是DCA,所以DCA为一类)
上面的候选码为CE(求候选码过程略过)
由于CEGH没有出现在上面的任何一类中,所以单独分类
最终:
{AD}、{ED}、{DB}、{BCD}、{DCA}、{CE}、{GH}
第7章 数据库设计
I. 数据库设计的基本步骤
(1)需求分析
(2)概念结构设计:ER图、数据字典
(3)逻辑结构设计:把ER图转换为逻辑模型
(4)物理结构设计:逻辑模型转换为物理模型
(5)数据库实施:写SQL代码
(6)数据库运行和维护:性能检测、转储、恢复
数据字典包括:(1)数据项(2)数据结构(3)数据流(4)数据存储(5)处理过程
II. 需求分析
要开发一个什么样的数据库,结合具体实际来定
III. 概念设计
ER图
矩形:实体(实体是客观存在,可以相互区别的事物)
椭圆:属性
菱形:联系
联系:两个实体之间的联系
1:1 一对一的联系,比如身份证和人(有且仅有)
1:N 一对多的联系,比如班级和学生
M:N 多对多的联系,比如顾客和商品
比如(a)一个课程可以有n本参考书,一个课程可以有m个教师讲授——1:m:n联系
在多对多联系中还能添加属性
下面是一个例子:
IV. 逻辑结构设计
所谓逻辑结构设计就是把ER图转换为表
1:1 一对一,在任意一方加入对方的主码并设为其外码,并加入联系本身的属性
1:n 一对多,将1方的主码加入n方的外码,并同时将联系的属性加入n方
m:n 多对多,将联系本身转换为一个关系模式,将联系双方的主码加入其中设为码,并将联系的属性也加入其中
能看到这里相信你一定很用心了
那我就给你找了个视频更好地理解逻辑结构设计吧!(其实就是我懒了(~ ̄▽ ̄)~ )
V. 物理结构设计
确定数据库的物理结构,对物理结构进行评价
设计关系模式的存取方法
VI. 数据库的实施与维护
这里如果想深入了解请看书,不做介绍
第9章 关系查询和优化
I. 查询处理
查询处理的4个阶段
(1)查询分析
(2)查询检查
(3)查询优化
(4)查询执行
查询优化包括代数优化和物理优化
代数优化是本章的重点,优化树
II. 优化代数
具体内容可以仔细看书,这里讲一个核心要点
连接操作是很费时间的,所以我们尽量简化我们的连接操作
先进行选择和投影,最后才做连接
Why?
因为如果先连接再投影,会先做笛卡尔积(一张大大的表,但是有用的只有几行,然后再选择,因此增加了运算时间),如果先选择和投影,则减少了笛卡尔积的数量,大大减少了运行时间
III. 物理优化
具体内容可以看书,不是本章重点