数据库系统讲人话系列 关系数据库 关系代数

附常用名词转化:
【1】关系:即我们脑子里面的一张二维表
【2】元组:某一行数据
【3】域:某一列数据的子集
【4】关系模型:R(A1,A2,A3...)R(A_1,A_2,A_3...)

关系代数在数据库里面的作用就相当于把我们在 Excel 里面的操作用数学语言表达出来。

第二话:关系代数

1.1 传统集合运算

就是:“交并差”。
RSR \cap SRSR\cup SRSR - S

注意,我们对关系进行传统集合运算的时候,必须保证:两个关系的属性完全一致!

1.2 专门集合运算

1.2.1 投影 projection

投影实质上是就是属性选择器
格式:
πa1,a2...(R)\pi_{a_1,a_2...}(R)

举例子:已知关系Student(二维表)

age name class dept number
11 ZW 1 CS 01001
10 VCD 2 CS 02003
12 NMG 1 CS 01002
9 KLJ 1 CS 01003
11 HG 2 IS 02004

那么πage,number(Student)\pi_{age,number}(Student)运算之后的结果:

age number
11 01001
10 02003
12 01002
9 01003
11 02004
1.2.2 选择 selection

是元组选择器。也就是选中行
格式:
σconditions(R)\sigma_{conditions}(R)
conditions 写的是行选择条件。
举例子:
对上面二维表 σdept=IS(Student)\sigma_{dept='IS'}(Student) 运算之后,得到:

age name class dept number
9 KLJ 1 CS 01003

如果,对关系进行投影和选择组合操作的话,我们需要优先操作“选择”。

1.2.3 连接 join

对一张二维表操作还远远不够,我们需要考虑到把两个关系(二维表)进行合并的情况。这时,我们就需要Join运算。

在学Join运算之前,我们需要知道笛卡尔积 :R x S。

假如,现在有R和S两个关系,满足:
R:n个属性,k1个元组
S:m个属性,k2个元组

那么R x S之后得到的笛卡尔积的大二维表满足:
m+n个属性,k1*k2个元组。

笛卡尔运算实际上就是在关系里面我们按一个元组作为最小的同类元素,我们对这个数组的每个元素搭配另外一个数组的每个元素。
数据库系统讲人话系列 关系数据库 关系代数
当我们需要对两个表进行合并的时候,必然涉及到一些谁去谁留的问题,我们利用笛卡尔积可以先把所有的结果都呈现出来,然后再进行运算筛选。

连接操作的格式:
数据库系统讲人话系列 关系数据库 关系代数

R join S
a条件b

a和b分别是R和S的列名
实际上等价于σabRXS\sigma_{a条件b}(R X S)

单单这样的连接并没有太大意义,我们一般常会使用两种连接:等值连接自然连接

等值连接

等值连接的意义:σR.a=S.aRXS\sigma_{R.a=S.a}(R X S)

例子:
数据库系统讲人话系列 关系数据库 关系代数

自然连接

而自然连接实际上就是再等值连接的基础上,去除相同的公共的属性列。
我们直接写,就表示默认自然连接:
RSR \infty S

例子:
数据库系统讲人话系列 关系数据库 关系代数

1.3 组合运算

1.3.1 基础组合运算

已知有四个关系(表):(加粗的是主键 Primary Key)
T(TID,TNAME,TITLE)
C(CID,CN,CNAME,TID)
S(SID,SNAME,AGE,SEX)
SC(SID,CID,SCORE)

现在,我们需要用关系代数来实现以下运算:

【1】检测课程号为C2的学生的学号和成绩

思考:
给定某个属性的查询,就是选择,然后再对选择结果进行一次投影即可。(注意,我们要优先操作“selection”)

πSID,SCORE(σCID=C2(SC))\pi_{SID,SCORE}(\sigma_{CID='C2'}(SC))

【2】检测课程号为C2的学生的学号和姓名

思考:
当我们进行一次选择之后,发现SC表里面没有姓名这个属性,如果我们需要姓名就需要到表S里面拿,我们需要增加数据,这时就需要到自然连接Join操作了。

πSID,SNAME(σCID=C2(SC)S)\pi_{SID,SNAME}(\sigma_{CID='C2'}(SC)\infty S)

【3】检索至少选修Liu老师的课程中一门课程的学生的学号和姓名

πSID,SNAME(σTNAME=Liu(T)CSCS)\pi_{SID,SNAME}(\sigma_{TNAME='Liu'}(T)\infty C \infty SC \infty S)

【4】检索选修课程号为C2或者C4课程的学生学号

πSID(σCID=C2CID=C4(SC))\pi_{SID}(\sigma_{CID='C2' \vee CID='C4'}(SC))

易错:
【5】检索选修课程号是C2和C4课程的学生学号
思考,我们把\vee换成\wedge就对了吗?
不对!!

假如是:
πSID(σCID=C2CID=C4(SC))\pi_{SID}(\sigma_{CID='C2' \wedge CID='C4'}(SC))

表示出现歧义,CID到底是C2还是C4?注意的是,CID只能等于一个值。

现在是选修C2的学生和选修C4的学生。
应该要写成:
πSID(σCID=C2(SC)σCID=C4(SC))\pi_{SID}(\sigma_{CID='C2'}(SC) \cap \sigma_{CID='C4'}(SC))

如何表达否定?我们使用传统的差即可
【6】检索不学C2课程的学生姓名和年龄
首先我们先选出学的学生:
πSNAME,AGE(σCID=C2(SC)S)\pi_{SNAME,AGE}(\sigma_{CID='C2'}(SC)\infty S)

再用全部减去即可:
πSNAME,AGE(S)πSNAME,AGE(σCID=C2(SC)S)\pi_{SNAME,AGE}(S)-\pi_{SNAME,AGE}(\sigma_{CID='C2'}(SC)\infty S)