关系代数是一种抽象的查询语言,它用对关系的运算来表达查询。
关系代数的运算按运算符的不同可分为传统的集合运算和专门的关系运算两类。
这部分在数据库系统概论课程中也是重点,会出至少10%的题目,个人觉得这部分内容有些概念很抽象,不太好理解,大家在复习的时候一定注意结合实例,多做做例题。
一.传统的集合运算
这一部分比较简单,我就不具实例了。
设关系R和S具有相同的目,且相同的属性取自同一个域,t是元组变量,t∈R表示t是R的一个元组。
R:
A | B | C |
a1 | b1 | c1 |
a1 | b2 | c2 |
a2 | b2 | c1 |
S:
A | B | C |
a1 | b2 | c2 |
a1 | b3 | c2 |
a2 | b2 | c1 |
1.并
关系R和关系S的并记作:R∪S={t|t∈R∨t∈S}
其结果仍为n目关系,由属于R或属于S的元组组成。
eg.R∪S
A | B | C |
a1 | b1 | c1 |
a1 | b2 | c2 |
a2 | b2 | c1 |
a1 | b3 | c2 |
2.差
关系R和关系S的差记作:R-S={t|t∈R∧t∉S}
其结果仍为n目关系,由属于R而不属于S的元组组成
R-S:
A | B | C |
a1 | b1 | c1 |
3.交
关系R和关系S的交记作:R∪S={t|t∈R∧t∈S}
其结果仍为n目关系,由既属于R由属于S的元组组成。关系的交可以用关系的差来表示,即:R∩S=R-(R-S)
R∩S:
A | B | C |
a1 | b2 | c2 |
a2 | b2 | c1 |
4.笛卡儿积
这里是指广义的笛卡儿积。
两个分别是n目和m目的关系R和S的笛卡儿积是一个(n+m)列的元组的集合。元组的前n列是关系R的一个元组,后m列是关系S的一个元组。若R有k1个元组,S有k2 个元组,则关系R和S的笛卡儿积有k1×k2个元组。
R: n目关系,k1个元组
S: m目关系,k2个元组
R×S:
列:(n+m)列元组的集合 元组的前n列是关系R的一个元组 后m列是关系S的一个元组
行:k1×k2个元组
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 |
二.专门的关系运算
先看一些概念
注:象集的本质是一次选择运算和一次投影运算
这之后就有些抽象了,结合书上的表作为实例
Student:
学号 Sno | 姓名 Sname | 性别 Ssex | 年龄 Sage | 所在系 Sdept |
201215121 | 李勇 | 男 | 20 | CS |
201215122 | 刘晨 | 女 | 19 | CS |
201215123 | 王敏 | 女 | 18 | MA |
201215125 | 张立 | 男 | 19 | IS |
Course:
课程号 Cno | 课程名 Cname | 先行课 Cpno | 学分 ccredit |
1 | 数据库 | 5 | 4 |
2 | 数学 | 2 | |
3 | 信息系统 | 1 | 4 |
4 | 操作系统 | 6 | 3 |
5 | 数据结构 | 7 | 4 |
6 | 数据处理 | 2 | |
7 | PASCAL语言 | 6 | 4 |
SC:
学号 Sno | 课程号 Cno | 成绩 Grade |
201215121 | 1 | 92 |
201215121 | 2 | 85 |
201215121 | 3 | 88 |
201215122 | 2 | 90 |
201215122 | 3 | 80 |
1.选择
选择又称为限制 (Restriction),含义是指在关系R中选择满足给定条件的诸元组
记作:
F表示选择条件,它是一个逻辑表达式, 取逻辑值“真”或“假” 。 逻辑表达式F的基本形式为:X1θY1,其 中θ表示比较运算符,X1 , Y1是属性名。
例1. 查询信息系(IS系)全体学生
例2. 查询年龄小于20岁的学生
2.投影
投影运算符的含义 :从R中选择出若干属性列组成新的关系
记作 πA(R) = { t[A] | t ∈R },其中A为R中的属性列
投影操作主要是从列的角度进行运算
投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)
例3. 查询学生的姓名和所在系
例4:查询学生关系Student中都有哪些系
πSdept(Student)
3.连接
连接也称为θ连接
连接运算的含义 (Semantics): 从两个关系的笛卡 尔积中选取属性间满足一定条件的元组
记作:
连接运算从R和S的笛卡尔积R×S中选取R关系在 A属性组上的值与S关系在B属性组上值满足比较 关系θ的元组。
常用的连接运算有等值连接和自然连接
等值连接:
θ为“=”的连接运算称为等值连接,指从关系R与S的广义笛卡尔积中选取A, B属性值相等的那些元组。
自然连接:
自然连接是一种特殊的等值连接
① 两个关系中进行比较的分量必须是相 同的属性组 ② 在结果中把重复的属性列去掉
自然连接的含义 (Semantics) R和S具有相同的属性组B
注:一般的连接操作是从行的角度进行运算。自然连接还需要取消重复列,所以是同时从行和列的角度进行运算
除此之外,连接还有外连接,左外连接,右外连接之分
外连接:如果把舍弃的元组也保存在结果关系中,而在 其他属性上填空值(Null),这种连接就叫做外连 接 (OUTER JOIN)。
左外连接:如果只把左边关系R中要舍弃的元组保留就叫做 左外连接 (LEFT OUTER JOIN或LEFT JOIN)
右外连接:如果只把右边关系S中要舍弃的元组保留就叫做 右外连接(RIGHT OUTER JOIN或RIGHT JOIN)
例5:
4.除
给定关系R(X, Y) 和S( Y, Z),X, Y, Z为属性组。R 中的Y与S中的Y可以有不同的属性名,但必须出 自相同的域集
含义:
R与S的除运算得到一个新的关系P(X)
P是R中满足下列条件元组在X 属性列上的投影:元组在X上分量值x的象集Yx包含S在Y上投影的集合
注:除操作是同时从行和列角度进行运算
例6:
R ÷ S:
A |
a1 |
除运算我的理解就是在R中,同时满足S中所有符合的信息,但是在S中没有字段的新表。
如上述例子,在R中满足S所有符合的信息为:{{b1,c2},{b2,c1},{b2,c3}},这些信息在R中但是S中没有的字段只有一个{a1},再加上a1的属性,所以结果为:
A |
a1 |
在来个例子,以开头的Student表举例:
例7:找出专业为CS的同学的信息
设一个表K:
Sdept |
CS |
那么Student÷K:
再分析一边:在Student中满足K所有符合的信息为:
201215121 | 李勇 | 男 | 20 | CS |
201215122 | 刘晨 | 女 | 19 | CS |
这些信息在Student中但是K中没有的字段再加上对应的属性,所以结果为:
学号 Sno | 姓名 Sname | 性别 Ssex | 年龄 Sage |
201215121 | 李勇 | 男 | 20 |
201215122 | 刘晨 | 女 | 19 |
这里我们也可以看到,得到的结果是专业为CS的全部学生,往往题目中出现“全部”,“至少”等字眼时,并涉及到两个即以上的值我们都可以考虑用“除”运算。(这里应该很好理解,只有一个值如上述例7,我们可以直接一个选择加投影完事)
综合练习:以开头Student、Course、SC表为例:
例8:查询至少选修1号课程和3号课程的学生号码
看见“至少”可以考虑用除运算:
设先建立一个临时关系K:
Cno |
1 |
3 |
只要学生号码,就在加上投影:πSno,Cno (SC)÷K={200215121};
例9:查询选修了2号课程的学生的学号
πSno(σCno='2'(SC))={200215121,200215122};
例10:查询至少选修了一门其直接先行课为5 号课程的学生姓名
这一题虽然有“至少”,但是只需要考虑一个,可以不用除运算
我们可以先找出来先修课为5的课程,把它和SC表以及Student在Sname的投影连接起来,最后求Sname。
或者
我们可以先找出来先修课为5的课程,把它和SC表连接起来,由于要求的是学生姓名,我们还需要把它和Student在Sname的投影连接起来,最后求Sname。
例10:查询选修了全部课程的学生学号和姓名。
有“全部”可以考虑除运算
我们可以先把Course表中所有的课程提出来,然后用SC表在Sno,Cno上的投影除去它,这样就能得到所有的选修了全部课程的学生学号,然后在和Student表在Sno,Sname上的投影连接,就得到了所有选修了全部课程的学生学号和姓名。
再来看一道大题,也是课本上的题目
例11:设有一个SPJ数据库,包括S、P、J及SPJ4个关系模式:
S表:
S(SNO,SNAME,STATUS,CITY)
供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成。
SNO | SNAME | STATUS | CITY |
---|---|---|---|
S1 | 精益 | 20 | 天津 |
S2 | 盛锡 | 10 | 北京 |
S3 | 东方红 | 30 | 北京 |
S4 | 丰泰盛 | 20 | 天津 |
S5 | 为民 | 30 | 上海 |
P表:
P(PNO,PNAME,COLOR,WEIGHT)
零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成。
PNO | PNAME | COLOR | WEIGHT |
---|---|---|---|
P1 | 螺母 | 红 | 12 |
P2 | 螺栓 | 绿 | 17 |
P3 | 螺丝刀 | 蓝 | 14 |
P4 | 螺丝刀 | 红 | 14 |
P5 | 凸轮 | 蓝 | 40 |
P6 | 齿轮 | 红 | 30 |
J表:
J(JNO,JNAME,CITY)
工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。
JNO | JNAME | CITY |
---|---|---|
J1 | 三建 | 北京 |
J2 | 一汽 | 长春 |
J3 | 弹簧厂 | 天津 |
J4 | 造船厂 | 天津 |
J5 | 机车厂 | 唐山 |
J6 | 无线电厂 | 常州 |
J7 | 半导体厂 | 南京 |
SPJ表:
SPJ(SNO,PNO,JNO,QTY)
供应商情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,表示某供应商供应某种零件给某工程项目的数量为QTY。
SNO | PNO | JNO | QTY |
---|---|---|---|
S1 | P1 | J1 | 200 |
S1 | P1 | J3 | 100 |
S1 | P1 | J4 | 700 |
S1 | P2 | J4 | 700 |
S1 | P2 | J2 | 100 |
S2 | P3 | J1 | 400 |
S2 | P3 | J2 | 200 |
S2 | P3 | J4 | 500 |
S2 | P3 | J5 | 400 |
S2 | P5 | J1 | 400 |
S2 | P5 | J2 | 100 |
S3 | P1 | J1 | 200 |
S3 | P3 | J1 | 200 |
S4 | P5 | J1 | 100 |
S4 | P6 | J3 | 300 |
S4 | P6 | J4 | 200 |
S5 | P2 | J4 | 100 |
S5 | P3 | J1 | 200 |
S5 | P6 | J2 | 200 |
S5 | P6 | J4 | 500 |
1)求供应工程J1零件的供应商号码SNO:
2)求供应工程J1零件P1的供应商号码SNO:
3)求供应工程J1零件为红色的供应商号码SNO:
4)求没有使用天津供应商生产的红色零件的工程号JNO:
5)求至少用了供应商S1所供应的全部零件的工程号JNO:
手写的,字不太好看……
再来几道不是书上的,自己随便写的题目:
6)求与“螺母”颜色相同的产品名
7)求供应P1、P2,两种产品的厂家名
8)求使用了全部零件的工程名
以上题目答案都不唯一,我写得也不一定是最简单的,欢迎大家讨论