DB-02 关系数据库
DB-02 关系数据库
一、关系模型的基本概念
关系模型是E.F.Codd在1970年提出的,它用"关系"(即二维表)来表示数据和数据之间的联系。关系模型之所以成为主流,是因为它有坚实的数学基础(集合论和谓词逻辑)和简洁统一的数据结构。
关系就是一张二维表。表中的每一行称为一个"元组"(对应一条记录),每一列称为一个"属性"(对应一个字段)。每个属性有一个取值范围,称为"域"。
候选码是能唯一标识一个元组的最小属性集合。例如,"学生(学号,姓名,身份证号,班级)"这个关系中,"学号"和"身份证号"都可以唯一确定一个学生,且都不能再缩小,所以它们都是候选码。
主码是从候选码中选定一个作为主要标识的码。通常在表设计中选择最常用的候选码作为主码。
外码是表中的一个或一组属性,它引用另一个表的主码。外码用于建立表与表之间的关联。例如,"学生"表中的"班级编号"属性引用了"班级"表的主码"班级编号",那么"班级编号"就是学生表的外码。
二、三类完整性约束
完整性约束是保证数据库中数据正确性和一致性的规则。关系模型定义了三类完整性约束。
实体完整性:主码的值不能取空值(NULL)。这个规则很容易理解——如果主码为空,就无法唯一确定一个元组,关系就失去了完整性。例如,"学生"表的主码是"学号",那么在插入学生记录时,学号字段不能为空。
参照完整性:外码的值要么为空,要么必须等于被引用表中某个元组的主码值。这个规则保证了表之间的关联不会"断裂"。例如,如果一个学生的"班级编号"字段值是"2024级软工1班",那么在"班级"表中必须存在一个主码为"2024级软工1班"的元组。
用户定义完整性:针对某个具体应用场景的约束条件。例如,年龄必须在0-150之间,性别只能取"男"或"女",成绩必须在0-100之间等。这些约束反映了业务规则对数据的要求。
三、关系代数运算
关系代数是一组作用于关系的运算,每个运算的输入是一个或多个关系,输出是一个新的关系。关系代数是SQL语言的数学基础。
3.1 传统集合运算
并(Union)、交(Intersection)、差(Difference)要求两个关系必须"兼容"——即属性数量相同,且对应属性取自同一个域。
并运算 R U S:返回在R或S中出现的所有元组。
交运算 R ∩ S:返回同时在R和S中出现的元组。
差运算 R - S:返回在R中出现但不在S中出现的元组。
广义笛卡尔积 R × S:R中的每个元组与S中的每个元组进行拼接,结果是一个包含R和S所有属性的新关系,元组数为|R| × |S|。
3.2 专门关系运算
选择(Selection):用σ表示,从关系中选取满足条件的行(元组)。这是对行(水平方向)的操作。例如,σ(Sdept='CS')(Student)表示从学生表中选取所有计算机系的学生。
投影(Projection):用π表示,从关系中选取指定的列(属性)。这是对列(垂直方向)的操作。投影后可能减少元组数量,因为重复的行会被去掉。例如,π(Sname, Sage)(Student)从学生表中选取姓名和年龄两列。
连接(Join):用⋈表示,将两个关系按指定的条件组合成一个新的关系。其中最常用的是等值连接(按相等条件连接)和自然连接(在等值连接的基础上去除重复列)。自然连接要求两个关系中有同名的属性列。
除(Division):用÷表示,是关系代数中最复杂的运算。R ÷ S的结果是满足条件的X属性值——这些X的象集必须包含S在Y上的所有投影。
3.3 综合查询例题
设有关系模式:
Student(Sno, Sname, Ssex, Sage, Sdept)
Course(Cno, Cname, Cpno, Credit)
SC(Sno, Cno, Grade)
例1:查询选修了2号课程的学生姓名。
π_Sname(σ_Cno='2'(SC ⋈ Student))
先对SC做选择(筛选出课程号为2的记录),然后与Student做自然连接,最后投影出姓名。
例2:查询选修了所有课程的学生学号。
π_Sno,Cno(SC) ÷ π_Cno(Course)
先求SC在Sno和Cno上的投影(每个学生选了哪些课),再求Course在Cno上的投影(全部课程的列表),两者相除得到"选了所有课程"的学生学号。
例3:查询没有任何一门课程不及格的学生学号和姓名。
π_Sno,Sname(Student) - π_Sno,Sname(σ_Grade<60(Student ⋈ SC))
全体的学生减去至少有一门不及格的学生。
例4:查询选修了数据库原理课程的学生姓名。
π_Sname(σ_Cname='数据库原理'(Course ⋈ SC ⋈ Student))
例5:查询至少选修了95001选修的所有课程的学生学号。
设K = π_Cno(σ_Sno='95001'(SC))
结果 = π_Sno,Cno(SC) ÷ K