《数据库系统》第二章 关系数据库
本章重点
关系数据模型三要素
- 数据结构——关系(二维表)
- 数据操作
- 完整性约束
关系
- 关系代数(重点)
- 关系演算(不考推理,但概念要理解)
- SQL语句(结构化查询语言)
关系数据结构及形式化定义
关系
关系模型的数据结构非常简单,只包含单一的数据结构——关系。
- 域(domain):域是一组具有相同数据类型的值的集合。
- 笛卡尔积:给定一组域 D 1 , D 2 , … , D n D_1, D_2, \dots, D_n D1,D2,…,Dn,允许其中某些域是相同的,则这组域的笛卡尔积为: D 1 × D 2 × ⋯ × D n = { ( d 1 , d 2 , … , d n ) ∣ d i ∈ D i , i = 1 , 2 , … , n } D_1×D_2×\dots×D_n=\left \{(d_1, d_2, \dots, d_n) | d_i \in D_i, i = 1, 2, \dots, n\right \} D1×D2×⋯×Dn={(d1,d2,…,dn)∣di∈Di,i=1,2,…,n}。其中,每一个元素叫作一个n元组,或简称元组(二维表中的一行),元素中的每一个值 d i d_i di叫作一个分量(某一个属性)。一个域允许的不同取值个数称为这个域的基数(总共有多少个元素)。
- 关系:“关系”是“笛卡尔积”中的一部分数据。 D 1 × D 2 × ⋯ × D n D_1×D_2×\dots×D_n D1×D2×⋯×Dn的子集叫作在域 D 1 , D 2 , … , D n D_1, D_2, \dots, D_n D1,D2,…,Dn上的关系,表示为: R ( D 1 , D 2 , … , D n ) R(D_1, D_2, \dots, D_n) R(D1,D2,…,Dn)。n=1时为单元关系,n=2时为二元关系。
码(重点)
候选码:若关系中的某一属性组的值能唯一地标识一个元组,而其子集不能,则称该属性组为候选码。
e.g. 用学号和课程号可以唯一地标识一个选课项,缺少任意一个属性都无法标识该选课项,则学号和课程号为候选码。
主码:若一个关系有多个候选码,则选定其中一个为主码。
e.g. 既可以用学号唯一标识一个学生,也可以用身份证号唯一标识一个学生。这样,身份证号可以作为Student表的主码。
主属性:候选码的诸属性称为主属性。(一定注意这里是候选码)
非主属性:不包含在任何候选码中的属性称为非主属性或非码属性。
全码:关系模式的所有属性是这个关系模式的候选码,称为全码。(理解:在一张表中,但凡缺少一种属性,都无法确定具体的某一行,则这些属性加起来称为全码)
外部码:又称“外码”。如果一个关系中的一个属性(该属性不能是候选码)是另外一个关系中的主码,则这个属性为外码。外部码对应“参照完整性约束”。定义:设F是基本关系R的一个或一组属性,但不是关系R的码, K s K_s Ks是基本关系S的主码。如果F与 K s K_s Ks相对应,则称F是R的外码,并称基本关系R为参照关系,基本关系S为被参照关系或目标关系。 R ( K r , F , … ) , S ( K s , … ) R(K_r, F, \dots), S(K_s, \dots) R(Kr,F,…),S(Ks,…)
关系的类型
- 基本关系(通常又称为基本表或基表):基本表是实际存在的表,它是实际存储数据的逻辑表示
- 查询表:是查询结果对应的表
- 视图表:是由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据。
基本关系的性质
- 列是同质的,即每一列中的分量是同一类型的数据,来自同一个域。
- 不同的列可出自同一个域,称其中的每一列为一个属性,不同的属性要给与不同的属性名。
- 列的顺序无所谓,即列的次序可以任意交换。
- 任意两个元组的候选码不能取相同的值。
- 行的顺序无所谓,即行的次序可以任意交换。
- 分量必须取原子值,即每一个分量都必须是不可分的数据项。(最基本的一条)
关系与关系模式
- 关系:数据(动态)
- 关系模式:表结构(静态)
关系模式
关系的描述称为关系模式。可表示为: R ( U , D , D O M , F ) R(U,D,DOM,F) R(U,D,DOM,F)。其中R为关系名,U为组成该关系的属性名集合,D为U中属性所来自的域,DOM为属性向域的映像集合,F为属性间数据的依赖关系集合。
关系数据库
所有关系的集合构成一个关系数据库。
关系操作的特点是集合操作方式。
关系操作
e.g. 增删改查
5种基本操作
选择、投影、并、差、笛卡尔积。(其他关系操作非必须,可用于简化表达式)
关系的完整性
关系模型中有三类完整性约束:实体完整性、参照完整性和用户定义的完整性。
实体完整性规则:若属性(指一个或一组属性)A是基本关系R的主属性,则A不能取空值。所谓空值就是“不知道”或“不存在”或“无意义”的值。
参照完整性规则:若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码 K s K_s Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须:
- 或者取空值
- 或者等于S中某个元组的主码值
e.g. 对于一个学生的专业而言,要么尚未分配专业,要么只能从专业列表中选取主码值作为学生的专业。
用户定义的完整性:用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。
关系代数(重点)
传统的集合运算
包括并、差、交、笛卡尔积四种运算。
(注: ∨ \vee ∨是“或”, ∧ \wedge ∧是“且”)
并:关系R与关系S的并记作: R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R\cup S=\left \{ t|t\in R \vee t \in S \right \} R∪S={t∣t∈R∨t∈S}
差:关系R与关系S的差记作: R − S = { t ∣ t ∈ R ∧ t ∉ S } R-S=\left \{ t | t \in R \wedge t \notin S \right \} R−S={t∣t∈R∧t∈/S}
交:关系R与关系S的交记作: R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R \cap S = \left \{ t | t \in R \wedge t \in S \right \} R∩S={t∣t∈R∧t∈S}
笛卡尔积:两个分别为n目和m目的关系R和S的笛卡尔积是一个(n+m)列的元组的集合。元组的前n列是关系R的一个元组,后m列是关系S的一个元组。若R有 k 1 k_1 k1个元组,S有 k 2 k_2 k2个元组,则关系R和关系S的笛卡尔积有 k 1 × k 2 k_1×k_2 k1×k2个元组。
e.g.
R:
A | B | C |
---|---|---|
a 1 a_1 a1 | b 1 b_1 b1 | c 1 c_1 c1 |
a 1 a_1 a1 | b 2 b_2 b2 | c 2 c_2 c2 |
a 2 a_2 a2 | b 2 b_2 b2 | c 1 c_1 c1 |
S:
A | B | C |
---|---|---|
a 1 a_1 a1 | b 2 b_2 b2 | c 2 c_2 c2 |
a 1 a_1 a1 | b 3 b_3 b3 | c 2 c_2 c2 |
a 2 a_2 a2 | b 2 b_2 b2 | c 1 c_1 c1 |
R×S:
R.A | R.B | R.C | S.A | S.B | S.C |
---|---|---|---|---|---|
a 1 a_1 a1 | b 1 b_1 b1 | c 1 c_1 c1 | a 1 a_1 a1 | b 2 b_2 b2 | c 2 c_2 c2 |
a 1 a_1 a1 | b 1 b_1 b1 | c 1 c_1 c1 | a 1 a_1 a1 | b 3 b_3 b3 | c 2 c_2 c2 |
a 1 a_1 a1 | b 1 b_1 b1 | c 1 c_1 c1 | a 2 a_2 a2 | b 2 b_2 b2 | c 1 c_1 c1 |
a 1 a_1 a1 | b 2 b_2 b2 | c 2 c_2 c2 | a 1 a_1 a1 | b 2 b_2 b2 | c 2 c_2 c2 |
a 1 a_1 a1 | b 2 b_2 b2 | c 2 c_2 c2 | a 1 a_1 a1 | b 3 b_3 b3 | c 2 c_2 c2 |
a 1 a_1 a1 | b 2 b_2 b2 | c 2 c_2 c2 | a 2 a_2 a2 | b 2 b_2 b2 | c 1 c_1 c1 |
a 2 a_2 a2 | b 2 b_2 b2 | c 1 c_1 c1 | a 1 a_1 a1 | b 2 b_2 b2 | c 2 c_2 c2 |
a 2 a_2 a2 | b 2 b_2 b2 | c 1 c_1 c1 | a 1 a_1 a1 | b 3 b_3 b3 | c 2 c_2 c2 |
a 2 a_2 a2 | b 2 b_2 b2 | c 1 c_1 c1 | a 2 a_2 a2 | b 2 b_2 b2 | c 1 c_1 c1 |
专门的关系运算
专门的关系运算包括选择、投影、连接、除运算等。
t [ A i ] t[A_i] t[Ai]表示元组t中相应于属性 A i A_i Ai的一个分量。
t r t s ⌢ \stackrel\frown{t_r t_s} trts⌢称为元组的连接或元组的串接。它是一个n+m列的元组,前n个分量为R中的一个n元组,后m个分量为S中的一个m元组。
e.g. t r ( a , b , c ) t_r(a, b, c) tr(a,b,c) t s ( d , e ) t_s(d, e) ts(d,e) t r t s ⌢ ( a , b , c , d , e ) \stackrel\frown{t_r t_s}(a, b, c, d, e) trts⌢(a,b,c,d,e)
象集:给定一个关系R(X,Z),X和Z为属性组。当t[X]=x时,x在R中的象集定义为: Z x = { t [ Z ] ∣ t ∈ R , t [ X ] = x } Z_x=\left \{t[Z] | t \in R , t [X] = x \right \} Zx={t[Z]∣t∈R,t[X]=x}。它表示R中属性组X上值为x的诸元组在Z上分量的集合。(理解:当某一列取角标中的值时,对应Z的取值集合)
e.g.
R:
x 1 x_1 x1 | Z 1 Z_1 Z1 |
---|---|
x 1 x_1 x1 | Z 2 Z_2 Z2 |
x 1 x_1 x1 | Z 3 Z_3 Z3 |
x 2 x_2 x2 | Z 2 Z_2 Z2 |
x 2 x_2 x2 | Z 3 Z_3 Z3 |
x 3 x_3 x3 | Z 1 Z_1 Z1 |
x 3 x_3 x3 | Z 3 Z_3 Z3 |
x 1 x_1 x1在R中的象集 Z x 1 = { Z 1 , Z 2 , Z 3 } Z_{x1} = \left \{ Z_1, Z_2, Z_3 \right \} Zx1={Z1,Z2,Z3}
x 2 x_2 x2在R中的象集 Z x 2 = { Z 2 , Z 3 } Z_{x2} = \left \{ Z_2, Z_3 \right \} Zx2={Z2,Z3}
x 3 x_3 x3在R中的象集 Z x 3 = { Z 1 , Z 3 } Z_{x3} = \left \{ Z_1, Z_3 \right \} Zx3={Z1,Z3}
选择:它是在关系R中选择满足给定条件的诸元组,记作
σ F ( R ) = { t ∣ t ∈ R ∧ F ( t ) = ′ 真 ′ } \sigma _F(R) = \left \{ t | t \in R \wedge F(t) = '真' \right \} σF(R)={t∣t∈R∧F(t)=′真′}
其中F表示选择条件,它是一个逻辑表达式,取逻辑值“真”或“假”。
e.g. 查询信息系(IS系)全体学生。
σ S d e p t = ′ I S ′ ( S t u d e n t ) \sigma _{Sdept='IS'} (Student) σSdept=′IS′(Student)
注意:下标中为单引号。
e.g. 查询年龄小于20岁的学生。
σ S a g e < 20 ( S t u d e n t ) \sigma _{Sage<20}(Student) σSage<20(Student)
投影:关系R上的投影是从R中选择出若干属性列组成新的关系。记作
Π A ( R ) = { t [ A ] ∣ t ∈ R } \Pi_A(R)= \left \{ t [A] | t \in R \right \} ΠA(R)={t[A]∣t∈R}
其中A为R的属性列。
e.g. 查询学生的姓名和所在系,即求Student关系上学生姓名和所在系两个属性上的投影。
Π S n a m e , S d e p t ( S t u d e n t ) \Pi _{Sname, Sdept} (Student) ΠSname,Sdept(Student)
(理解:括号里的内容为查询表的名称,得到的结果是表)
连接:连接也称为 θ \theta θ连接。它是从两个关系的笛卡尔积中选取属性间满足一定条件的元组。记作
R ⋈ A θ B S = { t r t s ⌢ ∣ t r ∈ R ∧ t s ∈ S ∧ t r [ A ] θ t s [ B ] } R \bowtie_{A \theta B} S = \left \{ \stackrel\frown{t_r t_s} | t_r \in R \wedge t_s \in S \wedge t_r[A] \theta t_s[B] \right \} R⋈AθBS={trts⌢∣tr∈R∧ts∈S∧tr[A]θts[B]}
理解:相当于筛选出符合条件的笛卡尔积元组。
【选择、投影、连接 小结】
- 选择( σ \sigma σ)选的是行
- 投影( Π \Pi Π)选的是列
- 连接( ⋈ \bowtie ⋈)挑出来的是笛卡尔积
等值连接: θ \theta θ为“=”的连接运算称为等值连接。(第一个关系的属性值与第二个关系的属性值相等)
自然连接( ⋈ \bowtie ⋈,符号下方无表达式):是一种特殊的等值连接。它要求两个关系中进行比较的分量必须是同名的属性组(公共属性),并且在结果中把重复的属性列去掉。
e.g. R.A 和 S.A 可以视为同名的属性组。在写自然连接的表时,不区分 R.A 和 S.A 。在写等值连接的表时,表中可能同时存在R.A和S.A。
悬浮元组:在做自然连接时被舍弃的元组(元组是某些行)。(注:指在连接前的表中的元组)
R:
A | B | C |
---|---|---|
a1 | b1 | 5 |
a1 | b2 | 6 |
a2 | b3 | 8 |
a2 | b4 | 12 |
S:
B | E |
---|---|
b1 | 3 |
b2 | 7 |
b3 | 10 |
b3 | 2 |
b5 | 2 |
除运算(难点):设关系R除以关系S的结果为关系T,则T包含所有在R但不在S中的属性及其值,且T的元组与S的元组的所有组合都在R中。
用象集来定义除法:给定关系R(X, Y)和S(Y, Z),其中X, Y, Z为属性组。R中的Y与S中的Y可以有不同的属性名,但必须出自相同的域集。R与S的除运算得到一个新的关系P(X),P是R中满足下列条件的元组在X属性列上的投影:元组在X上分量值x的象集 Y x Y_x Yx包含S在Y上投影的集合。记作
R ÷ S = { t r [ X ] ∣ t r ∈ R ∧ Π Y ( S ) ⊆ Y x } R÷S = \left \{ t_r [X] | t_r \in R \wedge \Pi_Y(S) \subseteq Y_x \right \} R÷S={tr[X]∣tr∈R∧ΠY(S)⊆Yx}
其中 Y x Y_x Yx为x在R中的象集, x = t r [ X ] x=t_r[X] x=tr[X]。
参考:https://blog.csdn.net/skyejy/article/details/80890842
e.g. 有关系R和S
关系R:
A | B | C |
---|---|---|
a1 | b1 | c2 |
a2 | b3 | c7 |
a3 | b4 | c6 |
a1 | b2 | c1 |
a4 | b6 | c6 |
a2 | b2 | c3 |
a1 | b2 | c3 |
关系S:
B | C | D |
---|---|---|
b1 | c2 | d1 |
b2 | c1 | d1 |
b2 | c3 | d2 |
借助象集的概念:
关系R和关系S拥有共同的属性B、C,R÷S得到的属性值就是关系R包含而关系S不包含的属性,即A属性。
在R关系中A的属性的值可以取{a1, a2, a3, a4}
a1值对应的象集为{(b1, c2), (b2, c1), (b2, c3)}
a2值对应的象集为{(b3, c7), (b2, c3)}
a3值对应的象集为{(b4, c6)}
a4值对应的象集为{(b6, c6)}
关系S在B、C上的投影为{(b1, c2), (b2, c1), (b2, c3)}
只有a1值对应的象集包含关系S的投影集,所以只有a1应该包含在A属性中,所以R÷S为:
A |
---|
a1 |
关系演算
- 检索操作:GET
- 范围变量:RANGE