文章目录
2.1 关系
关系是关系模型的一种数据结构。
逻辑结构上体现为一张表:
- 关系的每一列称为
属性
,例如表中的user_id
是用户身份标识号,属性可以描述这一列的值的意义。 - 关系有时也称为
表
。
基本概念
域
记作D
(domain)
笛卡尔积
笛卡尔积是一种域上的运算,记为:
D
1
×
D
2
×
.
.
.
×
D
n
=
{
(
d
1
,
d
2
,
.
.
.
,
d
n
)
∣
d
i
∈
D
i
,
i
=
1
,
2
,
.
.
.
,
n
}
D_1×D_2×...×D_n = \{(d_1, d_2, ...,d_n)|d_i∈D_i, i=1,2,...,n\}
D1×D2×...×Dn={(d1,d2,...,dn)∣di∈Di,i=1,2,...,n}
目前有三个域(教师、课程、学生)
用一个可能不太准确,但容易理解的方式描述笛卡尔积:笛卡尔积就是不同域中元素的组合
比如这里是【李怡】和【数学、英语】、【学生】的组合。
-
笛卡尔积是没有语义的,就好像你不能确保【李怡】教3个科目,科目的学生恰好是那3个学生。
-
笛卡尔积中的每一个组合(每一行)称为一个
n元组
,这取决于每一行有多少列(在上述的例子中是3元组),记为:
( d 1 , d 2 , . . . , d n ) (d_1, d_2,...,d_n) (d1,d2,...,dn) -
元组中的某一个值称为
分量
([ 李怡 | 英语 | 王杰 ] 中英语就是一个分量)。 -
一个域中允许的不同取值叫做这个域的
基数
(教师的基数=2,学科的基数=2,学生域的基数=3)。
笛卡尔积中的基数 = 每一个域的基数的乘积
关系
关系
就是笛卡尔积的子集,表示为:
R ( D 1 , D 2 , . . . , D n ) R(D_1, D_2, ..., D_n) R(D1,D2,...,Dn)
R表示Relation;n是关系的目
或度
,就是关系有多少个属性。
特别的,n=1时称为单元关系
,n=2时称为二元关系
。候选码
:某组属性可以确定一个唯一的元组。
①这组少一个属性都不行
②可以只有一个属性- 如果一个关系有多个候选码,则选择其中一个作为
主码
。
例如学生信息表中,有两个候选码:
1.{学号}
2.{身份证号}
此时如果选择{学号}
作为学生的唯一标识,那么{学号}
称为主码(选择{身份证号}
当然也是可以的)。 主属性
:候选码中的属性。非主属性
:不属于候选码中的属性。- 极端情况下,关系中的所有属性就是这个关系的候选码,那么称这个候选码为
全码
。
关系表中的三种类型
- 基本表(又称为
基本关系
或基表
)
实际存在的表:
- 查询表
根据查询结果得到的表。
查询年龄大于20岁的用户:
- 视图表
是一个虚拟表,不会存在于磁盘空间中。
其实就是一些查询语句的集合,被封装了起来,像函数一样。
这里将查询年龄20岁以上的用户
这个需求,封装成了一个视图
。
那么视图表:
基本关系的性质
基本关系的每一个分量,都必须是不可分的。
也就是每一个数据项都要是基本的数据类型(整型、字符串、…),不能是一个表。
2.1.2关系模式
关系模式在第二章表示为R(U, D, DOM)
U:组成该关系的属性名集合
D:U中属性所来自的域
DOM:属性向域的映像的集合
吐槽一下课本,这DOM的描述说的是人话吗?
举个例子,某个关系如下:
那么:
U:{教工号、学号、课程号}
D:{教师、学生、课程}
DOM:{DOM(教工号) = 教师、DOM(学号)=学生、DOM(课程号)=课程}
所谓映射就像函数一样,给它一个输入,得到一个输出。
DOM就是输入属性
得到该属性的域
。
2.2 关系操作
增删改查,懂得都懂。
插入、删除、修改、查询。
- 查询操作有:
选择
、投影
、连接
、除
、并
、差
、交
、笛卡尔积
等。 - 操作的对象和结果都是集合。
2.3 关系的完整性
实体完整性
:
如果属性(组)A是关系R的主属性,那么A不为空。
其实主属性就是区分出关系中的某个元组(某一行)的条件,如果条件为空,也就是无条件,那么是无法区分关系中的任何元组的。
参照完整性
:
学生(学号,姓名,专业)
课程(课程号,课程名,学分)
选修(课程号,学号,学时)
学号
是学生的主码,课程号
是课程的主码,课程号
和学号
是选修的主码。
参照指的是:一个基本关系的属性引用了别的关系的属性。
假设F是关系R的属性(一个或一组),但F不是关系R的主码,Ks是关系S的主码。如果F与Ks对应(相同),则称F是R的外码
,R为参照关系
,S为被参照关系
或目标关系
。
R中的每个元组在F属性上的值要么为空,要么为关系S上某个元组的主码值。
学生(专业号,学号,姓名)
专业(专业号,专业名称)
学生关系中,专业号要么为空(未分配专业),要么为专业中的某个主码值(某个专业)
用户定义的完整性
用户自定义的完整性有很多,比如:
某个属性必须非空
某个属性的值必须在0~100之间(成绩)
等等。
2.4 关系代数
2.4.1传统的集合运算
交、并,大家都清楚。
差
:
关系R与关系S的差记作R-S
,就是除去R中属于S的部分。
笛卡尔积
关系R和关系S的笛卡尔积记作:
R × S = { t r t s ⏠ ∣ t r ∈ R ∧ t s ∈ S } R×S = \{\overgroup{t_r \ \ t_s}|tr \in R\land ts\in S \} R×S={tr ts ∣tr∈R∧ts∈S}
2.4.2 专门的关系运算
1.选择
σ
F
(
R
)
=
{
t
∈
R
∧
F
(
t
)
=
t
r
u
e
}
σ_F(R) = \{ t∈R∧F(t)=true \}
σF(R)={t∈R∧F(t)=true}
其中F为条件,选择运算的效果是:筛选出关系中满足条件F的元组。
选择条件:年龄大于20:
2.投影
从关系中选出某一列作为新的关系。
∏
A
=
{
t
[
A
]
∣
t
∈
R
}
\prod_A = \{ t \quad [A] | t∈R \}
A∏={t[A]∣t∈R}
3.连接
连接也称为θ连接
,它是从两个关系的笛卡尔积中选出满足条件的部分,记作:
R
⋈
A
θ
B
S
=
{
t
r
t
s
⏠
∣
t
r
∈
R
∧
t
s
∈
S
∧
t
r
[
A
]
θ
t
s
[
B
]
}
R \underset{AθB}⋈ S = \{ \overgroup{t_r \ \ t_s} | t_r∈R ∧t_s∈S∧t_r[A]θt_s[B] \}
RAθB⋈S={tr ts
∣tr∈R∧ts∈S∧tr[A]θts[B]}
θ为等值连接,从关系R和S中选出属性A和B相等的元组,拼接成同一个元组。
自然连接
会去掉连接后的元组中的属性A或属性B(因为它们两个都是相等的)。
3.1 外连接
等值连接其实是将两个关系中相同属性的部分筛选出来。
有两个表:
两张表都有有个共同的属性:专业代号
,因此通过这个属性,我们能查询出每个学生对应的专业。
全外连接:
专业代号
是冗余的。
左外连接与右外连接
关系R与S做按照属性F
等值连接时,R中的某些元组可能不存在与S中F属性相同的值。(S中的某些元组也有可能在R中找不到对应)
那么在全外连接中会被舍弃,这些被舍弃的元组叫做悬浮元组
。
按照例子中就是指:
某个学生的专业编号由于某些原因错误了,在专业表中查找不到。
某个专业太冷门了,没有一个学生选择。
还记得R与S连接记为:
R
⋈
A
θ
B
S
R \underset{AθB}⋈ S
RAθB⋈S
左外连接
就是保留R中的悬浮元组
,右外连接
就是保留S中的悬浮元组
。
将R记为学生表,S记为专业表
左外连接(保留
学生表
中的悬浮元组
)
右外连接(保留
专业表
中的悬浮元组
)