1 关系
1 域( domain)
定义:域是一组具有相同数据类型的值的集和
例如,自然数、整数、{0,1)、{男,女”(用来表示性别的取值范围)、{学士,“硕士,博士“(表示学位的取值范围)、大于等于0且小于等于100的正整数(用来表示百分制成绩取值范图)长度不超过字节的字符串集合等,都可以是域。
空值(用null表示)是所有可能的域的一个取值,表名值未知或不存在。例如,对于表示学位的取值域,某员工的学位为空值nul,表示不知道该员工所获得的学位,或该员工没有获得学位;对于表示成绩的取值域,某学生的成绩为空值null,表示不知道该学生的成绩,或该学生没有成绩。
2 笛卡尔积(cartesian product)
定义:给定一组域
D
1
,
D
2
,
.
.
.
,
D
n
D_1, D_2,...,D_n
D1,D2,...,Dn ,它们之中可以有相同的域,
D
1
,
D
2
,
.
.
.
,
D
n
D_1, D_2,...,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\times D_2\times ...... \times D_n=\{(d_1, d_2,...,d_n)|d_i\in D_i, i=1, 2, ......, n \}
D1×D2×......×Dn={(d1,d2,...,dn)∣di∈Di,i=1,2,......,n}
其中,集合中的每一个元素
(
d
1
,
d
2
,
.
.
.
,
d
n
)
(d_1, d_2,...,d_n)
(d1,d2,...,dn) 成为一个n元组,简称为元组(touple);元素的每一个值
d
i
d_i
di 成为一个分量(component)。
例:给定两个域:
学生的姓名集合:D1={李小勇,刘方晨,王红敏}
课程的名称集合:D2={数据库系统概论’,操作系统“}
则D,D2的笛卡儿积为
D1XD2={(‘李小勇’,‘数据库系统概论’),(‘李小勇’,‘操作系统’)
(‘刘方晨’,‘数据库系统概论’),(‘刘方晨’,‘操作系统’),
('王红敏’,‘数据库系统概论’),(‘王红敏’,‘操作系统’)}
该笛卡儿积的基数M=3×2=6,即D1×D2共有6个元组,如图所示
姓名 | 课程名称 |
---|---|
李小勇 | 数据库系统概论 |
李小勇 | 操作系统 |
刘方晨 | 数据库系统概论 |
刘方晨 | 操作系统 |
王红敏 | 数据库系统概论 |
王红敏 | 操作系统 |
3 关系( relation)
定义:D1XD2×…×Dn的子集称为在域D1,D2,…,Dn上的关系,表示为
r(D1,D2,…,Dn)
其中:表示关系的名字;n是关系的目或度( degree)。
当n=1时,称该关系为单元关系;当n=2时,称该关系为二元关系。
关系是笛卡儿积的有限子集,所以关系也是一个二维表,表的每行对应于关系的一个元组,表的每列对应于关系的一个域。由于域可以相同,为了区别就必须给每列起一个名字,称为属性(attribute)。n目关系共有n个属性。
一般来说,D1,D2,…,Dn的笛卡儿积是没有实际语义的。只有它能够构成一个关系的某个子集才有实际含义。例如,对于上图中的6个元组,如果“李小勇”同学只修读了“数据库系统概论”课,没有修读“操作系统”课,那么第1个元组有实际含义,而第2个元组没有实际含义。因此,我们也称表的一行(即关系的一个元组)是由有关联的若干值成,它对应于现实世界中一个实体的若干属性的值的集合。
2 关系运算
1 选择
选择操作时在关系r中查找满足给定谓词(即选择条件)的所有元组,记作:
σ
p
(
r
)
=
{
t
∣
t
∈
r
∧
P
(
t
)
}
\sigma_p(r)=\{t|t\in r\wedge P(t)\}
σp(r)={t∣t∈r∧P(t)}
其中:P(predicate)表示谓词(即选择条件),它是一个逻辑表达式,取值为“真”或“假”。
例1:在数据库ScoreDB(Class表)中,查找2015级的所有班级情况
σ
g
r
a
d
e
=
2015
(
C
l
a
s
s
)
\sigma_{grade=2015}(Class)
σgrade=2015(Class)
例2:在数据库ScoreDB(Student表)中,查找所有2000年及以后出生的女学生情况
σ
y
e
a
r
(
b
i
r
t
h
d
a
y
)
≥
′
200
0
′
∧
s
e
x
=
′
女
′
(
S
t
u
d
e
n
t
)
\sigma_{year(birthday)\geq '2000'\wedge sex='女'}(Student)
σyear(birthday)≥′2000′∧sex=′女′(Student)
2 投影
关系是一个二维表,对它的操作可以从水平(行)的角度进行,即选择操作,也可以从纵向(列)的角度进行,即投影操作。
关系 r 上的投影是从 r 中选出若干属性列组成新的关系。记作:
∏ A ( r ) = { t [ A ] ∣ t ∈ r } \prod_A(r) = \{ t[A] | t\in r\} ∏A(r)={t[A]∣t∈r}
其中:A 为关系 r 的属性集合。
例1:在数据库ScoreDB(Student表)中,查找所有学生的姓名和民族
∏ s t u d e n t N a m e , n a t i o n ( S t u d e n t ) \prod_{studentName,nation}(Student) ∏studentName,nation(Student)
例2:在数据库ScoreDB(Student表)中,查找所有“蒙古族”学生的姓名和籍贯
∏
s
t
u
d
e
n
t
N
a
m
e
,
n
a
t
i
o
n
(
σ
n
a
t
i
o
n
=
′
蒙
古
族
′
(
S
t
u
d
e
n
t
)
)
\prod_{studentName,nation}(\sigma_{nation}='蒙古族'(Student))
∏studentName,nation(σnation=′蒙古族′(Student))
3 连接
连接也称也称为
θ
\theta
θ 连接。假设连接条件为谓词
θ
\theta
θ ,记为
A
o
p
B
A op B
AopB ,其中A,B分别为关系 r 和 s 中的度数相等且可比的连接属性集,op 为比较运算符。则
θ
\theta
θ 连接是从两个关系的笛卡尔积中选取连接属性间满足谓词
θ
\theta
θ 的所有元组。记作:
r
⋈
θ
s
=
{
t
r
⋅
t
s
∣
t
r
∈
r
∧
t
s
∈
s
∧
(
r
.
A
o
p
s
.
B
)
}
r\bowtie _{\theta}s=\{t_r\cdot t_s|t_r\in r\wedge t_s\in s\wedge (r.A\quad op\quad s.B)\}
r⋈θs={tr⋅ts∣tr∈r∧ts∈s∧(r.Aops.B)}
θ
\theta
θ 运算就是从关系 r 和 s 的笛卡尔积
r
×
s
r×s
r×s 中,选取 r 关系在 A 属性集上的值与 s 关系在 B 属性集上的值满足谓词
θ
\theta
θ 的所有元组,即:
r
⋈
θ
s
=
σ
θ
(
r
×
s
)
r\bowtie _{\theta}s=\sigma_{\theta}(r\times s)
r⋈θs=σθ(r×s)
θ \theta θ 连接运算中有两种最常用、最重要的连接,一种是等值连接(equjoin),另一种是自然连接(natural join)。 θ \theta θ 为等值比较谓词的连接运算称为等值连接。
自然连接是一种特殊的等值连接,它要求两个参与连接的关系具有公共的属性集,即
R
∩
S
≠
∅
R\cap S\neq \varnothing
R∩S=∅ ,并在这个公共属性集上进行等值连接;同时,还要求将连接结果中的重复属性列去除掉,即在公共属性集中的列中保留一次。
记
R
∩
S
=
{
A
1
,
A
2
,
.
.
.
.
.
.
,
A
k
}
R\cap S=\{A_1,A_2,......,A_k\}
R∩S={A1,A2,......,Ak},则自然连接可记作:
r
⋈
s
=
{
t
r
⋅
t
s
∣
t
r
∈
r
∧
t
s
∈
s
∧
(
r
.
A
1
=
s
.
A
1
∧
r
.
A
2
=
s
.
A
2
∧
.
.
.
∧
r
.
A
k
=
s
.
A
k
)
}
r\bowtie s=\{t_r\cdot t_s|t_r\in r\wedge t_s\in s\wedge (r.A_1= s.A_1\wedge r.A_2= s.A_2\wedge ...\wedge r.A_k= s.A_k)\}
r⋈s={tr⋅ts∣tr∈r∧ts∈s∧(r.A1=s.A1∧r.A2=s.A2∧...∧r.Ak=s.Ak)}
例:在数据库ScoreDB中查询所有2016级的“蒙古族”学生的姓名
此查询涉及两个表Student,Class,且两表通过外键classNo关联,因此,自然连接可表示为:
S
t
u
d
e
n
t
⋈
C
l
a
s
s
=
σ
S
t
u
d
e
n
t
.
c
l
a
s
s
N
o
=
C
l
a
s
s
.
c
l
a
s
s
N
o
(
S
t
u
d
e
n
t
×
C
l
a
s
s
)
Student\bowtie Class=\sigma_{Student.classNo=Class.classNo}(Student\times Class)
Student⋈Class=σStudent.classNo=Class.classNo(Student×Class)
因此,最后的查询为:
∏
s
t
u
d
e
n
t
N
a
m
e
(
σ
n
a
t
i
o
n
=
′
蒙
古
族
′
(
S
t
u
d
e
n
t
)
⋈
σ
g
r
a
d
e
=
2016
(
C
l
a
s
s
)
)
\prod_{studentName}(\sigma_{nation='蒙古族'}(Student)\bowtie \sigma_{grade=2016}(Class))
∏studentName(σnation=′蒙古族′(Student)⋈σgrade=2016(Class))
= ∏ s t u d e n t N a m e ( σ S t u d e n t . c l a s s N o = C l a s s . c l a s s N o ( σ n a t i o n = ′ 蒙 古 族 ′ ( S t u d e n t ) × σ g r a d e = 2016 ( C l a s s ) ) ) =\prod_{studentName}(\sigma_{Student.classNo=Class.classNo}(\sigma_{nation='蒙古族'}(Student)\times \sigma_{grade=2016}(Class))) =∏studentName(σStudent.classNo=Class.classNo(σnation=′蒙古族′(Student)×σgrade=2016(Class)))
= ∏ s t u d e n t N a m e ( σ S t u d e n t . c l a s s N o = C l a s s . c l a s s N o ( σ n a t i o n = ′ 蒙 古 族 ′ ∧ g r a d e = 2016 ( S t u d e n t × C l a s s ) ) ) =\prod_{studentName}(\sigma_{Student.classNo=Class.classNo}(\sigma_{nation='蒙古族'\wedge grade=2016}(Student\times Class))) =∏studentName(σStudent.classNo=Class.classNo(σnation=′蒙古族′∧grade=2016(Student×Class)))
= ∏ s t u d e n t N a m e ( σ S t u d e n t . c l a s s N o = C l a s s . c l a s s N o ∧ n a t i o n = ′ 蒙 古 族 ′ ∧ g r a d e = 2016 ( S t u d e n t × C l a s s ) ) =\prod_{studentName}(\sigma_{Student.classNo=Class.classNo\wedge nation='蒙古族'\wedge grade=2016}(Student\times Class)) =∏studentName(σStudent.classNo=Class.classNo∧nation=′蒙古族′∧grade=2016(Student×Class))
= ∏ s t u d e n t N a m e ( σ n a t i o n = ′ 蒙 古 族 ′ ∧ g r a d e = 2016 ( σ S t u d e n t . c l a s s N o = C l a s s . c l a s s N o ( S t u d e n t × C l a s s ) ) ) =\prod_{studentName}(\sigma_{nation='蒙古族'\wedge grade=2016}(\sigma_{Student.classNo=Class.classNo}(Student\times Class))) =∏studentName(σnation=′蒙古族′∧grade=2016(σStudent.classNo=Class.classNo(Student×Class)))
= ∏ s t u d e n t N a m e ( σ n a t i o n = ′ 蒙 古 族 ′ ∧ g r a d e = 2016 ( S t u d e n t ⋈ C l a s s ) ) =\prod_{studentName}(\sigma_{nation='蒙古族'\wedge grade=2016}(Student\bowtie Class)) =∏studentName(σnation=′蒙古族′∧grade=2016(Student⋈Class))