• 外码“学生编号”和“课程编号”共同组成了该关系的主码,这两个属性的取值不能为空,只能为相应被参照关系中相应列中的取值。
【例子】表2.5中“学生编号”列的属性值“201301”必须等于表2.3中“学号”列中的某一个属性值;表2.5中的“课程编号”列的属性值“13989”必须等于表2.4中“课程号”列中的某一个属性值。
• 表2.6所示的专业关系major(专业编号, 专业名),该关系的主码是“专业编号”,且表2.3所示关系“学生”中的“专业号”与该关系中的“专业编号”相对应,即“专业号”是学生关系student的外码。在这种情况下,由于学生关系student中的“专业号”不是该关系的主码,因而“专业号”列的属性值可以取空值。
【例子】表2.3中学生“李鑫”所对应的“专业号”为空值,这表明尚未给该学 生分配专业。
3.用户定义的完整性
l 用户定义的完整性是指由用户定义的、针对某一具体应用需求制定的约束条件,多用于满足数据的一些语义要求。
【例子】在表2.5所示的关系SC中,经常定义这样的约束:成绩的取值必须在0~100之间;又如,某些属性值不能为空或取值必须唯一等。
l 用户定义完整性约束可以有效减少应用程序的负担,关系数据库管理系统都提供定义和检验这类完整性的机制和方法。
2.2 关系代数 l 2.2.1 基本集合运算
基本集合运算是指集合的并、交、差和笛卡儿积运算,这些运算都是二元运算。我们约定:本节中R和S都默认是n元关系,且对应属性取自同一个值域。以下介绍基于关系的基本集合运算。
1. 并∪
Ø n元关系R和S的并是一种新的n元关系,这个新的关系是由R的元组或S的元组组成,记为R∪S,即R∪S = {x | x∈ R∨x ∈ S}
2. 交∩
Ø n元关系R和S的交是一种新的n元关系,这个新的关系是由R和S的共同元组组成,也就是说,由既属于R的元组又属于S的元组组成,记为R∩S,
即R∩S = {x | x ∈ R ∧ x ∈S }
3. 差-
Ø n元关系R和S的差是一种新的n元关系,这个新的关系是由属于R的元组但不属于S的元组组成,记为R-S,即R-S = {x | x ∈ R∧x ∈S}
4. 笛卡儿积
Ø 设R和S分别是n元关系和m元关系,则R和S的笛卡儿积是一种(n + m)元关系,该关系是由R的每一个元组分别与S每一个元组进行“首尾并接”所得到的元组的集合,记为R×S,即R×S = {xr xs| xr ∈ R∧ xs ∈ S}
Ø xrxs是表示由元组xr和元组xs并接而得到的新元组。
【例子】如果xr =(1班,李好,78)且xs =(03987,陈永江,01,3班),
则xrxs =(1班,李好,78,03987,陈永江,01,3班)。
Ø 关系R和S的元组个数分别为kr和ks,则R×S的元组个数为kr×ks。
• 2.2.2 关系运算
关系一些特殊的运算,主要包括选择(σ)、投影(π)、连接(⋈ )、除(/)等。
Ø 先约定一种表示方法:设x为某一个关系R的一个元组,L为R的关系模式的一个子集(即属性子集),则令x(L)表示由元组x在属性子集L上的所有分量构成的新元组。
【例子】对于关系R(A,B,C,D),令x = (a , b ,c , d),则x({A,B,C}) = (a , b , c),x({C,D}) = (c , d),x({B}) = (b),等。
• 选择σ
从关系中筛选出满足既定条件的元组,这些元组组成了一个新的关系,这个操作过程称为选择。