四、数据库
1、三级模式结构
1、一个数据库可以有多个外模式,只能有一个内模式。
2、关系如图所示
2、两级映射
1、关系如图所示
2、外模式,模式:通过数据的逻辑独立性
3、模式,内模式:通过数据的物理独立性
3、关系
1、基本术语
关系 | 一个关系就是一张二维表,每个关系有一个关系名 |
---|---|
元组 | 表中的一行即为一个元组,对应存储文件中的一个记录值。 |
属性 | 表中的列称为属性,每一列有一个属性名。属性值相当于记录中的数据项或者字段值。 |
域 | 属性的取值范围(例如 sex 属性的取值范围为 男 或 女),即不同元组对同一个属性的值所限定的范围。例如,逻辑型属性只能从逻辑真(如T)或逻辑假(如F)两个值中取值。 |
关系模式 | 对关系的描述称为关系模式,由关系名和其属性集合构成,关系模式的格式为 关系名(属性名1,属性名2,…,属性名n)通常一个关系模式对应一个关系文件的结构。例如,以下关系模式对应学生数据库的学生表结构:R(S# ,SNAME,SEX,BIRTHDAY,CLASS) |
候选码(或候选键) | 属性或属性组合,其值能够唯一地标识一个元组。 |
主码(或主键) | 在一个关系中可能有多个候选码,从中选择一个作为主码。 |
主属性 | 包含在任何候选码中主属性称为主属性,不包含在任何候选码中主属性称为非主属性。 |
外码(或外键) | 如果一个关系中的属性或属性组并非该关系的码,但它们是另外一个关系的码,则称其为该关系的外码。 |
全码 | 关系模式的所有属性组是这个关系模式的候选码,称为全码。 假设有一个元组全部组合才能确定唯一的数据,就是全码 |
超码(超键) | 一个包含码的属性集称为超码,例如学号是码,则(学号,姓名) 就是一个超码。一个主属性和一个非主属性组合 |
1、可以将关系定义为元组的集合,关系模式则是指定的属性集合,元组是属性值的集合。一个具体的关系模型是若干个关系模式的集合。
2、实体完整性:
-
员工号和部门号是主码,其值不能为空。
-
学号和选课号为联合索引,他们的值都不能为空
-
一句话:实体的主键不能为空
3、参照完整性:
-
员工表中外码,部门号。在部门表中不能为空
-
一句话:A表中引用了B表中的主键,也就是A表的外键的值不能为空
4、关系代数
1、关系代数是施加于关系之上的一组集合代数运算,每个运算都以一个或多个关系作为运算对象,并生成另外一个关系作为该关系运算的结果。
2、关系代数包含传统的集合运算和专门的关系运算两类。
3、如图
1、∪并集
1、一句话,就是求A表中和B表中去除相同的行(元组,也可以理解为一条数据)然后组合在一起
2、∩交集
1、一句话,就是求A表中和B表中,既属于A又属于B的行(元组,也可以理解为一条数据),组合在一起。
3、差集
1、一句话,就是求属于A表中的行,又不属于B表中的行,进行组合在一起。
4、笛卡尔积
1、就是两个表相乘,所有A表行数据,和B表数据进行组合
2、一看就懂
5、投影
1、根据关系的垂直方向进行运算,就是选择列
2、也可以用列号来选择(默认是第1列开始)
3、使用π xx,xx(Y)
-
其中π是投影的意思
-
xx,xx是字段的,元组的意思
-
Y是表的意思
3、例子
5、选择
1、根据关系的水平方向进行运算,就是选择行
2、也可以根据单引号表示数值(就是具体一行中的某个值)
3、也可以用>、≥、<、≤、=、≠、与或非
4、例子一看就懂
6、连接
1、在笛卡尔积上,添加条件选择符合条件的行
1、θ连接也叫连接
1、可以理解为普通的添加了条件的连接
2、θ的值是 > ,<, >=, <= ,查找两个列满足这些运算关系的行
3、例子一看就懂
2、等值连接
1、一句话:就是θ的值是=
2、θ 的值是 "=",查找指定两个列的值相等的行
3、自然连接
1、思路
-
先找到两个关系(表)中相同的属性列
-
筛选出相同属性列中值相同的元素
-
去除重复属性列,然后组合
2、例子
4、左外连接
1、思路
-
如果A表中的数据,B表中有,但是A表没有(或者说不匹配的元组),就在A表中填写null
2、前提也是要进行自然连接
-
一般是去除第二个表的一样
3、例子
5、右外连接
1、A表示左表,B表示右表。B表中没有和A表中匹配的数据,就在B表中添加null
2、前提也是要进行自然连接
3、个人可以理解,右外连接是想保住右边表中的数据,但是,右边没有和左边对应的数据,就把没有的数据设置为null
6、全外连接
1、前提也是要进行自然连接
2、就是既要包含左外连接的null数据,又要包含右外连接的null数据
3、例子
5、关系代数转SQL语句
1、投影、选择转SQL
1、就是投影就是select
2、关系代数和SQL的区别
-
关系代数可以用列号,SQL不行
-
目的是在软考的时候迷惑你
3、笛卡尔积转SQL
1、可以理解为查询两个表的所有字段
2、例子
3、自然连接转SQL
1、自然连接
-
我们先要将两个表连接起来,根据字段(这里程序员应该懂)
-
然后去除重复的列
2、一句话:A.id 和B表.id这两个字段连接起来
-
与 == where xx and xxx
3、例子
6、SQL概述
1、体系结构
1、数据库的体系结构是由视图、基本表和存储文件三级结构组成。
2、分类
1、DDL (Data Definition Language )
-
数据定义语言
-
create:创建
-
alter:修改
-
drop:删除
2、DML(Data Manipulation Language)
-
数据操作语言
-
增删改语句
-
insert、delete、update
3、DQL(Data Query Language)
-
数据查询语言
-
查
-
Select
4、DCL(Data Control Language)
-
数据库对象的权限管理
-
事务管理
3、数据定义语言(DDL)
1、建立数据库: CREATE DATABASE 数据库名
2、建表
CREATE TABLE 表名 {
列名 数据类型,
...
完整性约束,
...
}
3、删除表
DROP TABLE 表名
4、修改表
ALTER TABLE 表名 ADD 列名 类型 #新增列
ALTER TABLE 表名 ALTER COLUMN 列名 新类型 #修改列
ALTER TABLE 表名 DROP COLUMN 列名 #删除列
5、列级约束完整性
语句 | 作用 |
---|---|
not null | 不能为空 |
unique | 唯一 |
not null unique | 不能为空且唯一 |
defalult | 设置默认值 |
6、例子
create table aa
(
a int not null,
b int unique,
c int not null unique,
d int default 1
)
7、表级完整性约束
约束条件 | 说明 | 完整性 |
---|---|---|
PRIMARY KEY | (主键子句)将字段设置为主键,值不能为空且唯一 | 实体完整性 |
CHECK | (检查子句)自定义效验规则 | 用户自定义完整性 |
FOREIGN KEY | (外键子句)外键(另一张表的字段) | 参照完整性 |
8、例子:创建主键子句
create table aa
(
sid int,
primary key(sid)
)
9、例子:检查子句
create table aa
(
sid int,
score int,
check (score >=0 and score <=100)
)
10、例子:外键子句
create table aa
(
cid int,
sid int,
foreign key(sid) references S(sid)
)
4、数据操作语言(DML)
1、插入: INSERT INTO 表名(列名序列) VALUES(元组值)、
2、修改: UPDATE 表名 SET 列名=表达式值[,列名=表达式值...] [WHERE 条件表达式]
3、删除:DELETE FROM 表名 [WHERE 条件表达式]
5、数据查询语句(DQL)
1、整体结构
-
SELECT 目标的列名或表达式序列
-
FROM 表名
-
[WHERE 条件表达式]
-
[GROUP BY 列名序列
-
[HAVING 组表达式条件]]
-
[ORDER BY 列名[ASC|DESC]]
2、字符串匹配
-
%:任意长度字符
-
_:任意一个字符
3、聚合函数
-
AVG():求平均
-
COUNT():求行数
-
MIN():求最小值
-
MAX():求最大值
-
SUM():求数值总和
4、分组
-
[GROUP BY 列名序列
-
使用了就不能用where
-
得用HAVING
5、内连接
-
INNER JOIN
6、自然连接上面有
7、外连接
-
左外:LEFT OUTER JOIN 或者 LEFT JOIN 都行
-
右外:RIGHT OUTER JOIN 或者 RIGHT JOIN 都行
-
全外:FULL OUTER JOIN 或者 FULL JOIN
8、子查询
-
类似嵌套,在where后面跟着一个Select
9、
6、带EXISTS测试的子查询
1、EXISTS 后面的select 查询,如果不为空返回ture, 否则返回false
2、扫描每一行,如果 EXISTS 返回ture就留下,否则舍弃
7、查询结果的并、交、差
7、SQL控制语句
1、授权语句
1、授权语句
GRANT <权限>[,<权限>]...[ON<对象类型><对象名> ] TO <用户>[,<用户>]..
[WTTH GRANT OPTION];
-
PUBLIC:接受权限的用户可以是单个或多个具体的用户,PUBLIC参数可将权限赋给全体用户。
-
WITH GRANT OPTION:若指定了此子句,那么获得了权限的用户还可以将权限赋给其他用户。
2、例子
2、收回权限
1、收回权限
REVOKE <权限>[,<权限1]..[ON<对象类型><对象名]
FROM <用户>[,<用户]...;
2、例子
8、视图
1、创建视图
1、格式
CREATE VIEW 视图名(列表名)
AS SELECT查询子句
[WITH CHECK OPTION];
-
WITH CHECK OPTION: 在对视图进行插入修改时,会验证数据是否符合where语句里的条件
注意,这里WITH GRANT OPTION:若指定了此子句,那么获得了权限的用户还可以将权限赋给其他用户。会考
2、删除视图
1、格式
DROP VIEW视图名
9、索引
1、可以理解为书籍的目录,创建聚簇索引,改变的是数据库的内模式
1、创建索引
CREATE [UNIQUE][CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][<列名>[<次序]--);
2、删除索引
DROP INDEX 索引名
10、关系模式
1、一个图就能理解了
2、关系模式
R(U,F) #重点 R(U,D,dom,F)
-
U:一组属性
-
F:数据依赖
-
D:数据域
-
dom:属性到域的映射
3、包含关系说明
符号 | 说明 | 示例 |
---|---|---|
⊇ | 包含 | {1,2,3} ⊇ {1,2} |
⊆ | 包含于 | {1,2} ⊆ {1,2,3} |
11、函数依赖
1、函数依赖
2、非平凡函数依赖
1、学号 —>姓名(非平凡函数依赖)
-
学号决定姓名
-
学号不包含姓名
3、平凡函数依赖
1、学号—>学号(平凡函数依赖)
-
学号决定学号
-
学号包含学号
4、完全函数依赖
1、(学号,课程号) —>成绩
-
学号和课程号两个字段决定了成绩的一行数据
2、一句话:就是只要两个(或多个)同时满足才能查出一条唯一的数据,就是完全函数依赖
5、部分函数依赖
只有组合属性才可能出现部分函数依赖,单属性都是完全函数依赖
1、(学号,课程号)—>姓名
-
学号或者课程号,只要两个其中一个可以决定姓名的一行数据,就是部分函数依赖
2、一句话:就是只要有一个满足,就能查出一条唯一的数据,就是部分函数依赖
6、依赖传递
1、A—>B,B—>C
-
A决定B,B决定C。就是依赖传递
12、码
1、总结
2、候选码
就是数据库表中的主键,可能是一个字段,也可能是多个字段的组合
1、例子
例: 如图所示 K 为 R(U,F)中属性的组合,
-
K可以决定U
-
K的真子集 学号,只能决定 姓名,不能决定 课程号,课程名,成绩
-
K的真子集 课程号,只能决定 课程名,不能决定 学号,课程名,成绩
-
因此 K 为R的候选码
3、主属性和非主属性
1、主属性: 包含在候选码中的属性
2、非主属性:不包含在候选码中的属性
3、如图
4、外码
1、如果一个关系中的一个属性(该属性不能是候选码)是另外一个关系中的主码则这个属性为外码。
2、如图
5、全码
1、所有属性的组合是关系的候选码。
2、一句话:就是所有属性都是主键,就是全码
6、超码
1、包含候选码的属性集合。
7、属性闭包计算❗
1、一句话:就是通过关系R和属性的依赖,来找出R的主键
2、小技巧
-
看依赖箭头右边,右边只要有出现的,大概率不是主属性
-
然后再根据去除右边已经有的属性,进行闭包判断
3、如图
13、范式
注意:范围:1NF>2NF>3NF>BCNF>4NF>5NF
就是说1NF范围最大,依次变小。
可以得出:如果是2NF,就一定包含了1NF。是1NF不一定是2NF
1、第一范式
1、一句话:只包含原子项,不可再分割
2、问题
-
不能排除数据冗余
-
更新异常等问题
3、主要原因:第1NF存在部分函数依赖
2、第二范式
1、一句话:就是在第1NF的基础上,消除部分函数依赖,就可以变成2NF
-
满足无非主属性对码的部分函数依赖(如果存在非主属性依赖于主属性,则不满足第二范式)。
2、问题
-
可能存在数据冗余
-
更新异常等问题
3、主要原因:第二范式存在:传递函数依赖。
3、第三范式
1、一句话:就是在第2NF的基础上,消除完全函数依赖,就可以变成3NF
-
满足非主属性对码的传递函数依赖(非主属性)
4、BC范式( BCNF)
1、既不存在非主属性对候选码的部分函数依赖或传递函数依赖,
2、也不存在主属性对候选码的部分函数依赖或传递函数
3、满足的条件
-
所有非主属性对每一个码都是完全函数依赖。
-
所有的主属性对每一个不包含它的码,也是完全函数依赖。
-
没有任何属性完全函数依赖于非码的任何一组属性。
4、一个满足BCNF的关系模式R已消除了插入和删除异常。
5、技巧
1、判断是否是第三范式,非主属性是否存在部分函数依赖
1、
-
先找出候选码,如果候选码是多个属性组成,则可能存在部分函数依赖
-
查看是否有非主属性(不在候选码中的属性)依赖于主属性(组成候选码的属性),如果有的话则是部分函数依赖
2、例子
2、判断传递函数依赖技巧
1、判断是否是BCNF,主属性是否存在部分函数依赖或传递函数依赖
2、几个规律
3、例子
5、总结
14、无损连接和保持函数依赖
1、无损分解
1、理解
-
无损连接性指的是对关系模式分解时,原关系模式下任一合法的关系实例在分解之后应能通过自然连接运算恢复起来。
2、例子
3、答案:是无损分解
-
R1∩R2 = A
-
R1 - R2 = B
-
R2 - R1 = C
-
又因为A—>B,所以是无损分解
2、保持函数依赖
1、个人认为,看看得了。用基本思路去想
2、定义
3、例子
15、数据库设计
总结
1、需求分析阶段
1、文档: 需求说明文档、数据字典和数据流程图(简称:数据流图)
2、成果: 主要包括数据流图、数据字典、需求说明文档 等
3、流入数据(用户需求)—>流出数据(数据流图、用户活动、数据字典)
4、如图理解
2、概念设计阶段
1、主要是ER图
注意:
①命名冲突:两个表的字段名字意思一样,名字不一样。异名同义
②结构冲突:一个表的属性,一个表的名字,冲突了
③属性冲突:属性的类型、取值范围、数据不同
2、流入数据(数据流图、数据字典)——>流出数据(ER图)
3、如图
3、逻辑设计阶段
1、主要:将E-R图转换成为指定的数据模型
2、流入数据(ER图)—>流出数据(关系模式,规范化,数据模型)
1、实体向关系模式的转换
1、一对一转换
1、是将联系归并到关联的两个实体的任一方, 给待归并的一方实体属性集中增加另一方实体的
码和该联系的属性即可,归并后的实体码保持不变。
2、一句话,两边都可以转。
3、例子
2、一对多
1、是将联系归并到关联的两个实体的多方,给待归并的多方实体属性集中增加一方实体的码和
该联系的属性即可,归并后的多方实体码保持不变。
2、一句话:就是把1的属性给多的属性。
3、例子
3、多对多
1、多对多联系只能转换成一个独立的关系模式,关系模式的名称取联系的名称,关系模式的属
性取该联系所关联的两个多方实体的码及联系的属性,关系的码是多方实体的码构成的属性组。
2、一句话:只能从新建个表。然后把之前有的两个字段主键,给新表,然后加上关系的字段
3、例子
16、事务管理
1、原子性:要么都做,要么都不做
2、一致性:事务执行的结果,必须保证数据库从一个一致性状态变到另一个一致性。
3、隔离性:多个事务发生,任意一个事务更新操作直到成功提交的整个过程,对其他事务是不可见的
4、持久性:一事务提交成功,即使数据库奔溃,对其数据库的更新操作也将永久有效
17、锁
1、排它锁:一个对象只能被一个事务加锁
2、共享锁: 一个对象能被多个事务加锁
18、分布式锁
1、四个透明
2、性质
标签:关系,依赖,函数,数据库,表中,数据,属性 From: https://blog.csdn.net/m0_57809109/article/details/143420652