1. 关系(relation)
2. 关系模式(relation schema)
3. 关系数据库(relation database)
1.传统的集合运算
2. 专门的关系运算
关系模型是关系数据库系统使用的数据模型,它只包含了单一的数据结构——关系,从用户的角度看来,关系只是一张简单的二维表。
下面通过例子介绍与关系相关的几个概念:
D1,D2和D3是相同数据类型的值的集合,它们被称为域(domain)。需要注意的是,域和属性(attribute)的概念比较类似,但属性<=域。
D1 = 导师集合 SUPERVISOR = {Bob,Jack}
D2 = 专业集合 SPECIALITY = {Computer,Art}
D3 = 研究生集合 POSTGRADUATE = {Yong,Tony,Zed}
笛卡尔积(D1xD2xD3)是域上的集合运算,可以表示为一张二维表。表中的每行对应一个元组(tuple),每列的值来自同一个域,这些值被称为分量(component),分量必须是不可分割的数据项。
D1有2个值,D2有2个值,D3有3个值,则笛卡尔积的基数为2x2x3 = 12,也就是D1xD2xD3一共有12个元组。
SUPERVISOR | SPECIALITY | POSTGRADUATE |
Bob | Computer | Yong |
Bob | Computer | Tony |
Bob | Computer | Zed |
Bob | Art | Yong |
Bob | Art | Tony |
Bob | Art | Zed |
Jack | Computer | Yong |
Jack | Computer | Tony |
Jack | Computer | Zed |
Jack | Art | Yong |
Jack | Art | Tony |
Jack | Art | Zed |
一般来说,每列(每个属性)对应一个域,不过也有不同列出自同一个域的情况。比如导师和研究生同来自PERSON域,但是在二维表中它们必须写在不同的列上,取不同的属性名:
D4 = 人 PERSON = {Bob,Jack,Yong,Tony,Zed}
关系是笛卡尔积的有限子集,是若干元组的集合,所以关系也是一张二维表。但一般来说,笛卡尔积的真子集才具有实际意义。比如当一名导师只上门一个专业,一位研究生只走一个专业方向时:
SUPERVISOR | SPECIALITY | POSTGRADUATE |
Bob | Computer | Yong |
Bob | Computer | Tony |
Jack | Art | Zed |
若某个关系含有n个域,则称该关系为n元关系。n是关系的目或度(degree)。
若关系中某一属性组能唯一标识一个元组,而其子集不能,则称该属性组为候选码(candidate key),亦称为关系的主属性(prime attribute)。如果关系中有多个候选码,则选定其中一个为主码(primary key)。
在最简单的情况下,候选码只包含一个属性,比如例子中的POSTGRADUATE属性就可以作为关系的主码。在最极端的情况下,所有属性是这个关系模式的候选码,称为全码(all-key)。
关系模式是对关系结构的描述,关系是关系模式在某一时刻的状态或内容。关系模式是静态稳定的,而关系是动态变化的,因为关系操作在不断更新着数据库中的数据。
在一个给定的应用领域中,所有关系的集合构成一个关系数据库。
关系模型中常用的关系操作包括查询(query)和插入(insert)、删除(delete)、修改(update)两大部分。
关系的查询表达能力很强,是关系操作中最主要的部分,其中选择、投影、并、差、笛卡尔积是5种基本操作,其他操作可以用基本操作定义和导出。
需要记住的是,关系操作的对象和结果都是集合。
关系模式中有三类完整性约束:实体完整性(entity integrity)、参照完整性(referential integrity)和用户定义的完整性(user-defined integrity)。
其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作关系的两个不变性。用户定义的完整性是应用程序需要遵循的约束条件,体现了具体领域中的语义约束。
(1)实体完整性:关系的主码不能取空值,因为主码唯一标识一个元组,对应现实中的一个实体。
(2)参照完整性:关系a中的某个属性取值需要参照关系b上的属性取值。一般来说,关系a参照的属性是关系b的主码,此时关系b的主码也被称为关系a的外码,关系a为参照关系,而关系b为被参照关系。若关系a中某一元组的外码值不参照关系b,则只能取空值。比如专业课程只包含Computer和Art,学生只能从中选一个或者都不选,而不可能选一个不存在的专业课程。
需要多提一下的是,参照表和被参照表可以是同一个表。
(3)用户定义的完整性:针对某一具体关系数据库的约束条件。例如某个属性必须取唯一值、某个非主属性不能取空值等。
早期的关系操作通常用代数方式或逻辑方式的查询语言来实现,分别称为关系代数(relational algebra)和关系演算(relation calculus)。
此外,还有一种介于关系代数和关系演算之间的结构化查询语言(Structured Query Language,SQL)。
SQL不仅具有丰富的查询功能,而且具有数据定义和数据控制功能,是集查询、DDL(数据定义语言)、DML(数据操纵语言)和DCL(数据控制语言)于一体的关系数据语言, 是关系数据库的标准语言。
SQL语言是一种高度非过程化的语言,用户不必请求DBA(数据库管理员)为其建立特殊的存取路径,存取路径的选择由关系数据库管理系统的优化机制来完成。
关系数据库管理系统中研究和开发了查询优化方法,系统可以自动选择较优的存取路径,提高查询效率。
关系代数是一种抽象的查询语言,它用对关系的运算来表达查询。关系代数的运算按运算符的不同可分为传统的集合运算和专门的关系运算两类。
A | B | C |
a1 | b1 | c1 |
a1 | b2 | c2 |
a2 | b2 | c1 |
A | B | C |
a1 | b2 | c2 |
a1 | b3 | c2 |
a2 | b2 | c1 |
(1)并(union):由属于关系R或关系S的元组组成。
A | B | C |
a1 | b1 | c1 |
a2 | b2 | c2 |
a2 | b2 | c1 |
a1 | b3 | c2 |
(2)交(intersection):由属于关系R且属于关系S的元组组成。
A | B | C |
a1 | b2 | c2 |
a2 | b2 | c1 |
(3)差(except):由属于(前一个)关系R而不属于(后一个)关系S的元组组成。
A | B | C |
a1 | b1 | c1 |
(4)笛卡尔积(cartesian product):关系R(n目,g个元组)和关系S(m目,h个元组)的笛卡尔积是(n+m)列,(gxh)个元组的集合。简单来讲,笛卡尔积只是一个组合问题而已。
R.A | R.B | R.C | S.A | S.B | S.C |
a1 | b1 | c1 | a1 | b2 | c2 |
a1 | b1 | c1 | a1 | b3 | c2 |
a1 | b1 | c1 | a2 | b2 | c1 |
a1 | b2 | c2 | a1 | b2 | c2 |
a1 | b2 | c2 | a1 | b3 | c2 |
a1 | b2 | c2 | a2 | b2 | c1 |
a2 | b2 | c1 | a1 | b2 | c2 |
a2 | b2 | c1 | a1 | b3 | c2 |
a2 | b2 | c1 | a2 | b2 | c1 |
学号Sno | 姓名Sname | 性别Ssex | 年龄Sage | 所在系Sdept |
2010 | J | 男 | 18 | CS |
2015 | K | 男 | 19 | CS |
2112 | L | 女 | 18 | IS |
(1)选择(selection):从关系中选取使逻辑表达式为真的元组。比如:
查询IS系的全体学生:σSdept = 'IS'(Student)
Sno | Sname | Ssex | Sage | Sdept |
2112 | L | 女 | 18 | IS |
查询年龄小于19岁的学生:σSage < 19(Student)
Sno | Sname | Ssex | Sage | Sdept |
2010 | J | 男 | 18 | CS |
2112 | L | 女 | 18 | IS |
(2)投影(projection):从关系中选取若干个属性列组成新的关系(二维表)。比如:
查询学生姓名和所在系:πSname,Sdept(Student)
Sname |
Sdept |
J | CS |
K | CS |
L | IS |
但需要注意的是,投影后不仅取消了原关系中的某些列,还有可能因为取消列后出现重复行,这些重复行也应该取消掉。比如:
查询有哪些系:πSdept(Student)
Sdept |
CS |
IS |
(3)连接(join):从两个关系的笛卡尔积中选取属性间满足一定条件的元组。连接运算中两种最常用的连接分别是等值连接(equijoin)和自然连接(natural join)。自然连接是特殊的等值连接。
A | B | C |
a1 | b1 | 5 |
a1 | b2 | 6 |
a2 | b3 | 8 |
a2 | b4 | 12 |
B | D |
b1 | 3 |
b2 | 7 |
b3 | 10 |
b3 | 2 |
(我的马鸭,这个神仙符号我真的打不出来了 o _ o |||)
A | R.B | C | S.B | D |
a1 | b1 | 5 | b1 | 3 |
a1 | b2 | 6 | b2 | 7 |
a2 | b3 | 8 | b3 | 10 |
a2 | b3 | 8 | b3 | 2 |
A | B | C | D |
a1 | b1 | 5 | 3 |
a1 | b2 | 6 | 7 |
a2 | b3 | 8 | 10 |
a2 | b3 | 8 | 2 |
从上面的二维表可以看出,自然连接是在等值连接的基础上将重复的属性列去掉。
在连接运算中被舍弃的元组称为悬浮元组(dangling tuple),如果将悬浮元组也保存在结果关系中,只需要在关系中增添元组,然后在其他属性上填空值(NULL)。
(4)除运算(division)
在学习除运算之前要先了解一个概念——象集(imagesset)。下面先给出关系R的二维表:
A | B | C |
a1 | b1 | c2 |
a2 | b3 | c7 |
a1 | b2 | c3 |
a4 | b6 | c6 |
a2 | b1 | c2 |
上面的二维表表示a1在关系R中的象集为{(b1,c2),(b2,c3)}。很容易理解,a1所在的元组上,对应的其余属性值构成的集合,就是a1的象集。
下面再给出关系S:
B | C | D |
b1 | c2 | d1 |
b2 | c3 | d5 |
关系S在属性列B和C上的投影为{(b1,c2),(b2,c3)},包含在a1的象集中,所以R÷S = {a1},这就是除运算的定义。
现在已经介绍了8种关系代数运算,其中并、差、笛卡尔积、选择和投影属于基本运算,另外3种运算(交、连接和除)都可以用这5种基本运算来表示。
路过的圈毛君:“你们可能会好奇为什么没有讲关系演算的内容,这是因为关系演算涉及到元组关系演算语言(ALPHA等)和域关系演算语言(QBE等),而我们接下来就要讲非常方便实用的SQL语言了,所以没必要再多花时间(其实主要是因为我懒_(:з」∠)_)。”