本文是数据库专栏【吐血整理】系列的第二篇,以介绍关系数据库为主,欢迎阅读~
关系: 单一的数据结构
现实世界的实体及实体间的各种联系均用关系来表示
二维表: 逻辑结构
从用户角度,关系模型中数据的逻辑结构是一张二维表
①域(Domain)
域(Domain): 域是一组具有相同数据类型的值的集合。
例如:整数、所有球类的集合,指定长度的字符串集合、{‘男人’,‘女人’} …
②笛卡尔积(Cartesian Product)
笛卡尔积(Cartesian Product):
给定一组域D1,D2,…,Dn,允许其中某些域是相同的
D1,D2,…,Dn的笛卡尔积为:
D1×D2×…×Dn = {(d1,d2,…,dn)| d i ∈ D i d~i~\in D~i~ d i ∈D i ,i=1,2,…,n}
总结一下: 笛卡尔积就是所有域的所有取值的一个组合(即全集),不能重复
举个栗子哈:
假设集合A={D,B},集合B={1,2,3},两个集合的笛卡尔积为:
AXB={(D,1),(D,2),(D,3),(B,1),(B,2),(B,3)}
~下标~
效果:下标^上标^
效果:上标· 元组(Tuple):
笛卡尔积中每一个元素(d1,d2,…,dn)叫作一个n元组(n-tuple)或简称元组
例如:在AXB={(D,1),(D,2),(D,3),(B,1),(B,2),(B,3)}中,每一个(D,1),(D,2)… 都是2元组
· 分量(Component):
笛卡尔积元素(d1,d2,…,dn)中的每一个值 di 叫作一个分量
例如:刚刚的例子中 D,B,1,2,3 都是分量
· 基数(Cardinal number):
若Di(i=1,2,…,n)为有限集,其基数为mi(i=1,2,…,n),则D1XD2X…XDn的基数M为:
M = ∏ i = i n m i M=\prod ^{n}_{i=i}m_{i} M=∏i=inmi (即基数的累乘)
可理解为:基数就是集合中的元素的个数
例如:集合A={D,B}基数为2,集合B={1,2,3}基数为3,AXB={(D,1),(D,2),(D,3),(B,1),(B,2),(B,3)}的基数为2×3=6
③关系(Relation)
1) 关系
D1XD2X…XDn的 子集 叫作在域D1,D2,…,Dn上的关系,表示为:
R(D1,D2,…,Dn)
R 是关系名,n 是关系的目或度
例如:COUPLE(BOY,GIRL),R=COUPLE ,n=2
2)关系的表示
关系是一个二维表
表的每行对应一个元组,表的每列对应一个属性
3)码(Key)
值得注意的是: D1,D2,…,Dn的笛卡尔积(全集) 的某个子集(即关系) 才 有实际含义。
三类关系:
· 基本关系(基本表或基表)
实际存在的表,是实际存储数据的逻辑表示
· 查询表
查询结果对应的表(暂存在内存)
· 视图表
由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据
基本关系的性质
① 列是同质的
② 不同的列可出自同一个域
其中的每一列称为一个属性
不同的属性要给予不同的属性名
③ 列的顺序无所谓,列的次序可以任意交换
④ 任意两个元组的候选码不能相同
⑤ 行的顺序无所谓,行的次序可以任意交换
⑥ 分量必须取原子值,这是规范条件中最基本的一条
关系模式------------型
· 对关系的描述
· 静态的、稳定的
关系------------------值
· 关系模式在某一时刻的状态或内容
· 动态的、不断变化的
举个栗子:
篮球(BASKETBALL)和足球(FOOTBALL)出自同一个域——球(BALL),
在模式中定义属性向域的映像,说明它们分别出自哪个域:
DOM(BASKETBALL)
= DOM(FOOTBALL)
= BALL
关系模式通常可以简记为:
R (U) 或 R (A1,A2,…,An)
关系模式和关系往往笼统称为关系,通过上下文加以区别
在一个给定的应用领域中,所有关系的集合构成一个关系数据库
关系数据库的型:
· 关系数据库模式,是对关系数据库的描述
关系数据库的值:
· 关系模式在某一时刻对应的关系的集合,通常称为关系数据库
关系数据库的物理组织
查询:
选择、投影、连接、除、并、差、交、笛卡尔积
(选择、投影、并、差、笛卡尔基是5种基本操作,下文的关系代数部分详细讲解)
更新:插入、删除、修改
关系代数语言
关系演算语言(元组关系演算语言和域关系演算语言)
具有关系代数和关系演算双重特点的语言
代表:SQL(Structured Query Language)
实体完整性规则(Entity Integrity)
· 若属性A是基本关系R的主属性,则属性A不能取空值
ps:空值就是“不知道”或“不存在”或“无意义”的值
比如:选修课(学号,课程号,成绩)
“学号、课程号”为主码
“学号”和“课程号”两个属性都不能取空值
可以简单记忆为:主属性不能为空
关系间的引用
在关系模型中实体及实体间的联系都是用关系来描述的
比如:学生实体、专业实体(主码用下划线表示)
学生(学号,姓名,性别,专业号,年龄)
专业(专业号,专业名)
这个例子中: 学生关系引用了专业关系的主码 “专业号”
学生关系中的 “专业号”值必须是 确实存在的专业的专业号
外码(Foreign Key)
设F是基本关系R的一个或一组属性,但不是关系R的码(ps:码可唯一确定一个元组)。如果F与基本关系S的主码Ks相对应,则称F是R的外码
· 基本关系R称为参照关系(Referencing Relation)
· 基本关系S称为被参照关系(Referenced Relation)
咱通过例子来理解一下:
“专业号”属性F是学生关系的外码
专业关系S是被参照关系,学生关系R为参照关系
参照完整性规则
若属性(或属性组)F是基本关系R的外码它与基本关系S的主码Ks 相对应,则对于R中每个元组在F上的值必须为:
简单记忆:外码要么为空,要么源自于被参照关系的主码
针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求
关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不需应用程序承担这一功能。
比如: 课程(课程号,课程名,学分)
· “课程号”属性必须取唯一值
· 非主属性“课程名”不能取空值
· “学分”属性只能取值{0.5,1.0,1.5,2.0,2.5,3.0}
R∪S
R - S
R ∩ S
如下图所示:
笛卡尔积(Cartesian Product)
严格地讲应该是广义的笛卡尔积
R: n目关系,k1 个元组(可理解为R有n列,k1行)
S: m目关系,k2 个元组(可理解为S有m列,k2行)
R X S
1. 选择(Selection)σ
选择 运算符的含义:
在关系R中选择满足给定条件的诸元组
σ F ( R ) = { t ∣ t ∈ R ∧ F ( t ) = ′ 真 ′ \sigma _{F}\left( R\right) =\{ t|t\in R\wedge F\left( t\right) =' 真' σF(R)={t∣t∈R∧F(t)=′真′}
F:选择条件,是一个逻辑表达式,取值为“真”或“假”
· 基本形式为:X1θY1
· θ表示比较运算符,它可以是>,≥,<,≤,=或 <>
比如:查询英语系(ES)的全体学生:
σ S d e p t = ′ E S ′ ( S t u d e n t ) \sigma _{Sdept}=_{'ES'}\left( Student\right) σSdept=′ES′(Student)
总而言之:选择运算是从关系R中选取使逻辑表达式F为真的元组,是从行的角度进行的运算
2. 投影(Projection)π
从R中选择出若干属性列组成新的关系
π A ( R ) = { t [ A ] ∣ t ∈ R \pi _{A}\left( R\right) =\{ t\left[ A\right]| t\in R πA(R)={t[A]∣t∈R }
A:R中的属性列
投影操作主要是从列的角度进行运算
投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)
· 举个栗子叭:查询学生的姓名和所在系。
即 求Student关系上学生姓名和所在系两个属性上的投影
πSname,Sdept(Student)
结果:
避免重复行 举例:查询学生关系Student中都有哪些系。
πSdept(Student)
结果只有三行,去掉了重复的DB
3 . 连接(Join)⋈
连接运算的含义:
从两个关系的笛卡尔积中选取属性间满足一定条件的元组
· A和B:分别为R和S上度数相等且可比的属性组
· θ:比较运算符
连接运算是:在R和S的广义笛卡尔积R X S中,选取R在A属性组上的值与S在B属性组上的值满足比较关系θ的元组
一般的连接操作是从行的角度进行运算
自然连接还需要取消重复列,所以是同时从行和列的角度进行运算
(此处连接就不展开介绍了,展开后比较多东西,以后会专门写关于连接(JOIN)的一篇文章)
4. 除 ÷
· 介绍除运算之前需要先介绍象集的概念:
给定一个关系R(X,Z),X和Z为属性组。
当t[X]=x时,x在R中的象集(Images Set) 为:
Z x = { t [ z ] ∣ t ∈ R , t [ X ] = x Z_{x}=\{ t\left[ z\right]|t\in R,t\left[ X\right]=x Zx={t[z]∣t∈R,t[X]=x }
它表示R中属性组X上值为x的诸元组在Z上分量的集合
(t[X] 表示元组 t中相应于属性X的一个分量)
来个栗子:
除运算的含义:给定关系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上投影的集合。
这样解释不太好理解,咱看下面的图理解一下哈:
在关系R中,A可以取四个值 {a1,a2,a3,a4}
a1 的象集为 {(b1,c2),(b2,c3),(b2,c1)}
a2 的象集为 {(b3,c7),(b2,c3)}
a3 的象集为 {(b4,c6)}
a4 的象集为 {(b6,c6)}
S在 (B,C) 上的投影为
{(b1,c2),(b2,c1),(b2,c3) }
只有a1的象集包含了S在(B,C)属性组上的投影
所以 R÷S ={a1}
并、差、笛卡尔积、投影和选择 这5种运算为关系代数中的基本运算(即 ∪、−、 X 、 Π \Pi Π 、σ)
其他的3种运算:交、连接和除(∩ 、⋈、÷),都可以用这5种基本运算来表示:
(R(A, C),S(B, C) ,A和B分别为R和S上度数相等且可比的属性组,θ是比较运算符 )
表示如下 |
---|
R ∩ S = R - (R - S) 或 S - (S - R) |
R ⋈ A θ B \underset{A θ B}\Join AθB⋈S = σ A θ B ( R × S ) \sigma_{A θ B}(R \times S) σAθB(R×S) |
R ÷ S = Π A ( R ) − Π A ( Π A ( R ) × Π C ( S ) − R ) \Pi_{A}(R) - \Pi_{A}(\Pi_{A}(R) \times \Pi_{C}(S) - R) ΠA(R)−ΠA(ΠA(R)×ΠC(S)−R) |
ps:请结合定义来理解表达式吖
在本章节的学习之后David老师给大家布置了一个关系代数的练习,俗话说的好 “光说不练假把式”,学了要会用吖!作业内容链接:【2019-2020春学期】数据库作业3:第二章课后题
在CSDN当中直接表达数学公式会略感无力,但是CSDN的Markdown提供了对LaTex公式的支持。对于数学公式转LaTex,我在这里给大家安利一个网站叭:在线识别手写公式(有时候也不是那么好用,不过日常使用是没问题哒~)
第6题题解如下:
此处LaTex公式除了在上面安利的网站中转化,也可以参考David老师的博客:在CSDN中使用“Markdown编辑器”编辑“关系代数”,毕竟掌握写法是根本,融会贯通
1) Π S N O ( σ J N O = ′ J 1 ′ ( S P J ) ) \Pi_{SNO}(\sigma_{JNO='J1'}(SPJ)) ΠSNO(σJNO=′J1′(SPJ))
2) Π S N O ( σ J N O = ′ P 1 ′ ∧ P N O = ′ J 1 ′ ( S P J ) ) \Pi_{SNO}(\sigma_{JNO='P1'}\wedge _{PNO='J1'}(SPJ)) ΠSNO(σJNO=′P1′∧PNO=′J1′(SPJ))
3) Π S N O ( Π S N O , P N O ( σ J N O = ′ J 1 ′ ( S P J ) ) ⋈ Π P N O ( σ C O L O R = ′ 红 ′ ( P ) ) ) \Pi_{SNO}(\Pi_{SNO,PNO}(\sigma_{JNO='J1'}(SPJ))\Join \Pi_{PNO}(\sigma_{COLOR='红'}(P))) ΠSNO(ΠSNO,PNO(σJNO=′J1′(SPJ))⋈ΠPNO(σCOLOR=′红′(P)))
4) Π J N O ( S P J ) − Π J N O ( Π P N O ( σ C O L O R = ′ 红 ′ ( P ) ) ⋈ Π S N O ( σ C I T Y = ′ 天 津 ′ ( S ) ) ⋈ Π S N O , P N O , J N O ( S P J ) ) \Pi_{JNO}(SPJ)-\Pi_{JNO}(\Pi_{PNO}(\sigma_{COLOR='红'}(P))\Join \Pi_{SNO}(\sigma_{CITY='天津'}(S)) \Join \Pi_{SNO,PNO,JNO}(SPJ)) ΠJNO(SPJ)−ΠJNO(ΠPNO(σCOLOR=′红′(P))⋈ΠSNO(σCITY=′天津′(S))⋈ΠSNO,PNO,JNO(SPJ))
5) Π J N O , P N O ( S P J ) ÷ Π P N O ( σ S N O = ′ S 1 ′ ( S P J ) ) \Pi_{JNO,PNO}(SPJ) \div \Pi_{PNO}(\sigma_{SNO='S1'}(SPJ)) ΠJNO,PNO(SPJ)÷ΠPNO(σSNO=′S1′(SPJ))
下面是手写版的:
那 本文到这里也就结束啦,感谢你耐心地阅读~ 如有不恰当的地方,望提出指正吖
这里是一个想把学习过程记录成博客分享给大家的undergraduate,请多关照
咱们下期 见~
上一篇:【吐血整理】数据库重点知识总结【1】
安利:SQL Server 数据库基本操作入门篇【2】