2.2 关系操作
2.2.1 基本的关系操作
- 查询:选择、投影、连接、除、并、交、差
- 数据更新:插入、删除、修改
- 查询的表达能力是其中最主要的部分
- 选择、投影、并、差、笛卡尔积是5种基本操作
2.4 关系代数
2.4.1 传统的集合运算
传统的集合运算是二目运算,包括并、差、交、笛卡尔积4种运算
并:R∪S={t | t∈R ∨ t∈S}
要有相同列
差:R-S={t | t∈R ∧ t∉S}
交:R∩S={t | t∈R ∧ t∈S}
笛卡尔积:R×S={tr⌒ts | tr∈R ∧ ts∈S}
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 |
R×S
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 |
2.4.2 专门的关系运算
专门的关系运算包括选择、投影、连接、除运算等
R:关系
t∈R:t是R的一个元组
t[Ai]:元组t中相应于属性Ai的一个分量
tr⌒ts:元组的连接
象集:
x1 | z1 |
---|---|
x1 | z2 |
x1 | z3 |
x2 | z2 |
x2 | z3 |
x3 | z1 |
x3 | z3 |
x1在R中象集:ZX1 = {Z1, Z2, Z3}
x2在R中象集:ZX2 = {Z2, Z3}
x3在R中象集:ZX3 = {Z1, Z3}
选择:
∑F®={t | t ∈ R ∧ F(t) = ‘真’}
F是选择条件,取逻辑值“真”或“假”
F的基本形式 X1θY1
θ可以是>, ≥, <, ≤, =或<>(≠)
举例:
∑Sdept=‘IS’(Student) 从Student表查询所在系是IS的元组
∑Sage<20(Student) 从Student表查询年龄小于20的元组
投影:
∏A®={t[A] | t ∈ R}
A为R中的属性列
举例:
∏Sname,Sdept(Student) 从Student表提取Sname和Sdept两列属性
注意:投影会取消重复元组P53
连接:
R▷◁S={tr⌒ts | tr ∈ R ∧ ts ∈ S ∧ tr[A] θ ts[B]}
AθB
连接分为三部分:普通连接,等值连接,自然连接 直接上图
R
A | B | C |
---|---|---|
a1 | b1 | 5 |
a1 | b2 | 6 |
a2 | b3 | 8 |
a2 | b4 | 12 |
S
B | E |
---|---|
b1 | 3 |
b2 | 7 |
b3 | 10 |
b3 | 2 |
b5 | 2 |
R▷◁S(普通连接)
C<E
A | R.B | C | S.B | E |
---|---|---|---|---|
a1 | b1 | 5 | b2 | 7 |
a1 | b1 | 5 | b3 | 10 |
a1 | b2 | 6 | b2 | 7 |
a1 | b2 | 6 | b3 | 10 |
a2 | b3 | 8 | b3 | 10 |
意思是用R的C和S的E作比较,如果C<E的话就把两张表连接在一起,为了区分两个表中的B,用R.B和S.B区分
等值连接:
A | R.B | C | S.B | E |
---|---|---|---|---|
a1 | b1 | 5 | b1 | 3 |
a1 | b2 | 6 | b2 | 7 |
a2 | b3 | 8 | b3 | 10 |
a2 | b3 | 8 | b3 | 2 |
R.B = S.B 时连接
自然连接:
A | B | C | E |
---|---|---|---|
a1 | b1 | 5 | 3 |
a1 | b2 | 6 | 7 |
a2 | b3 | 8 | 10 |
a2 | b3 | 8 | 2 |
去除多余的列
外连接:
A | B | C | E |
---|---|---|---|
a1 | b1 | 5 | 3 |
a1 | b2 | 6 | 7 |
a2 | b3 | 8 | 10 |
a2 | b3 | 8 | 2 |
a2 | b4 | 12 | NULL |
NULL | b5 | NULL | 2 |
把匹配不上的用NULL代替
左外连接:去除外连接倒数第一行,保留自己有的(倒数第二行)
右外连接:去除外连接倒数第二行,保留自己有的(倒数第一行)
除运算:
R÷S={tr[X] | tr ∈ R ∧ ∏Y(S)∈YX}
YX为x在R中的象集,x=tr[X]\
找出相同的列,能全除完就符合条件。
R
A | B | C |
---|---|---|
a1 | b1 | c2 |
a2 | b3 | c7 |
a3 | b4 | c6 |
a1 | b2 | c3 |
a4 | b6 | c6 |
a2 | b2 | c3 |
a1 | b2 | c1 |
Za1={(b1, c2), (b2, c3), (b2, c1)}
Za2={(b3, c7), (b2, c3)}
Za3={(b4, c6)}
Za4={(b6, c6)}
S
B | C | D |
---|---|---|
b1 | c2 | d1 |
b2 | c1 | d1 |
b2 | c3 | d2 |
R÷S
A |
---|
a1 |
【例2.10】查询至少选修1号课程和3号课程的学生号码
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 | PACAL语言 | 6 | 4 |
SC
学号sno | 课程号cno | 成绩grade |
---|---|---|
201215121 | 1 | 92 |
201215121 | 2 | 85 |
201215121 | 3 | 88 |
201215122 | 2 | 90 |
201215122 | 3 | 80 |
根据题意“查询至少选修1号课程和3号课程的学生号码”,建立一个临时关系k:
Cno |
---|
1 |
3 |
题目求学生号码,也就是Sno;用除运算解决该问题。有SNO又有CNO的查表可得是SC,筛选列的是∏, 答案就出来了:
∏Sno,Cno(SC) ÷ k
答案是{201215121}
【例2.11】查询选修了2号课程的学生的学号
建立一个临时关系k:
CnO |
---|
2 |
解题思路和上一题差不多
∏Sno,Cno(SC) ÷ k
还有一种解法
∏Sno(☌Cno=‘2’(SC))
【例2.12】查询至少选修了一门其直接先行课为5号课程的学生姓名
看Course表,只有Cpno='5’符合条件。接着看题意,求得是学生姓名,有Sname又有Cpno,没有这种表,所以需要连接。
∏Sname(☌Cpno=‘5’(Course)▷◁SC▷◁∏Sname,Sno(Student))
【例2.13】查询选修了全部课程的学生号码和姓名
∏Sno,Sname(☌Cno=‘1’∨’2’∨’3’(SC)▷◁Student)