专门的关系运算
选择
投影
连接
除
STUDENTSno,Sname,Ssex,Sage,Sdept)//学生表
COURSECno,Cname,Cpno,Ccredit)//课程表
SCSno,Cno,Grade) //选课表
1. 选择(Selection)
选择又称为限制(Restriction)
选择运算的含义
在关系中选择满足给定条件的诸元组
选择运算符σ
[例1] 查询信息系(IS系)全体学生
σ Sdept = 'IS' Student)
[例2] 查询年龄小于20岁的学生
σ Sage < 20Student)
[例3] 查询信息系年龄小于20岁的学生
σ Sdept = 'IS' ∧ Sage < 20Student)
∧ 逻辑与
∨ 逻辑或
2. 投影(Projection)
1)投影运算的含义
从R中选择出若干属性列组成新的关系
投影运算符π
2)投影操作主要是从列的角度进行运算
但投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)
3) 举例
[例1] 查询学生的姓名和所在系
即求Student关系上学生姓名和所在系两个属性上的投影
π Sname,SdeptStudent)
[例2]查询学生关系Student中都有哪些系
π SdeptStudent)
[例3] 查询CS系的学生姓名
π SnameσSdept='CS'Student) )
[例4] 查询没有选过课的学号
思路:所有学生号-选过课的学生号
π SnoStudent)- π SnoSC)
[例5]查询没有不及格的学号
思路:所有学号-有不及格的学号
π SnoStudent)- π SnoσGrade < 60 SC))
查询没有不及格的学号
这样做有错, 为什么?
π SnoσGrade>= 60 SC))
这是查询有过及格的学号!!!
[例6]查未被选修的课号
所有课号 – 被选修的课号
π cnoCourse) -π cnoSC)
3. 连接(Join)
1)连接运算的含义
从两个关系的笛卡尔积中选取属性间满足一定条件的元组
2)两类常用连接运算
等值连接(equijoin)
θ为“=”的连接运算称为等值连接
自然连接(Natural join)
两关系中相同属性组的等值连接
结果中去掉重复属性列
[例 1]查询有成绩>95的学号,姓名
分析:成绩在SC表中, 姓名在STUDENT表中
如果有一张大表,有学号、姓名、成绩 就好了
自然连接STUDENT和SC即可
π Sno,Sname σgrade>95Student连接SC) )
问题:什么时候要用到连接运算?
结论:当查询条件和结果来自两个关系时, 用连接
[例 2] 查询选修了2号课程的学生的学生名。
π Sname(σCno=‘2’(Student 连接 SC ))
[例3] 查询选修了先行课为5号课的课程的学生姓名。
π Snameσ Cpno='5'Student 连接 SC 连接 Course))
或
π Snameπ Sno,SnameStudent) 连接 SC 连接 σCpno='5'Course))//性能更好
[例4] 查询没有选过课的学号,姓名
π Sno,Sname Student 连接 πSnoStudent) - πSnoSC)) )
关系代数查询
三部曲
(1)连接
(2)选择
(3)投影
关系代数查询思路总结
首先确定查询哪个表
当查询内容和条件来自多个表时—多表查询,用自然连接
查询条件?用选择σ
查询内容?用投影π
三部曲:连接—选择—投影
题型“查询没有…”,用差运算-
所有… – 有…
练习题:
1.查询CS系的学生姓名
投影 Sname选择 Sdept=’cs’ Student))
2.查询有成绩>90的学号
投影 Sno 选择 Grade90c))
3.查询没有被选修的课号
投影CnoCourse)-投影cnosc)
4.查询没有被选修的课号,课名
投影 Cno, CnameCourse连接投影Cno Course)-投影cnoSc)
5.查询CS系成绩〉90的学号,姓名
投影sno, Sname选择 Sdept='cs' Student)连接选择 Grade>90sC)连接 Student)
6.查询数据库原理课成绩〉90的学号
投影 sno选择 Cname='数据库原理'Course)连接 选择Grade>90sc))
7.查询CS系数据库原理课成绩〉90的学号,姓名
投影 Sno, Sname选择 Cname='数据库原理' Course)连接 选择 Grade>90 Sc )连接 Student)
4 除运算
这里先引入一个象集的概念。
象集(Image Set)
关系RX , Y), X,Y是属性组,x是X上的取值
从R中选出在X上取值为x的元组,去掉X上的分量,只留Y上的分量,组成的关系成为x在R中的象集Yx 。
Yx = { t[Y] | t属于R 并且 t[X]= x }
除运算
给定关系R X,Y) 和S Y),其中X,Y 为属性组。则R÷S得到一个新的关系PX):
如果R中某元组在X上分量值x的象集Yx包含S , 则由x组成的元组就是P的元组。
R÷S = {x | S 真包含于 Yx }
Yx:x在R中的象集
[例1] 查询至少选修1号课程和3号课程的学生号码
这样写对吗?
π Cnoσ CNO=1 ∧ cno=2SC))
这是不对的,因为没有一条选课记录既选择了1号课又选择了2号课。
思路:
查询这样的学号,该学号对应的选课课号集合包含1号课和3号课的,我们就要先构造这个集合
首先建立一个临时关系K:
k = πCNOσ CNO=1 V CNO=3SC))
然后求:
π Sno,CnoSC)÷K
在这里的
πSno,CnoSC)
是
95001象集{1,2,3}, 包含K
95002象集{2,3}, 不包含K
于是:
π Sno,CnoSC)÷K = {95001}
[例2] 查询选修了全部课程的学生号码。
查询πSno,Cno(SC)中学号, 象集包含什么?
π Sno,Cno(SC)÷ π Cno(Course)
扩展:查询选修了全部课程的学生号码和姓名。
π Sno,Snameπ Sno,CnoSC)÷π CnoCourse))连接Student))
[例3]查询选修了95002所选全部课程的学生号码
π Sno,CnoSC)÷π Cnoσ SNO=95002 SC))
练习题:
1.查询选修了全部课程的学生号码
投影sno,cnosc)÷投影cno Course)
2.查询选修了全部课程的学生号码和姓名
投影sno, Sname投影sno,cnosc)÷投影cno ourse))连接 Student)
3.查询被所有学生选修的课程号
投影cno ,snosc)÷投影sno Student)
4.查询被所有学生选修的课程号,课名
投影cno, Cname投影Cno,snosc)÷投影Cno Student)连接 Course)
5.查询选修了95002所选全部课程的学生号码
投影sno,cnoSc)÷投影cno选择sno=95002sc))
6.查询选修了刘晨所选全部课程的学生号码
投影sno,cnosc)÷投影Cno选择 Sname=刘晨’sc连接 Student))
5.综合实例应用
图书管理数据库有关系模式:
图书书号,书名,价格,作者)
读者(读者号,姓名,性别,年龄)
借阅(读者号,书号,借日期,还日期,罚款金额)
1 查询价格大于50的书名和作者名
π 书名,作者名σ 价格>50图书))
2 查询一次)罚款金额>20元的读者名
π 姓名σ 罚款金额>20借阅 连接 读者))
3查询被年龄大于60的读者借过的书名和作者名
π 作者,书名 σ 年龄者>60 读者 连接 借阅 连接 图书 ))
4 查看了所有书的读者名
π 姓名 π 读者号,书号借阅) ÷ π 书号(图书)) 连接 读者)
5 查看了‘张三’所看过的所有书的读者名
π姓名 π 读者号,书号借阅) ÷ π书号(σ 姓名=‘张三’ 读者 连接 借阅)) 读者)
6 查询没有借过书的读者姓名
π姓名 π读者号 读者) - π读者号 借阅)) 连接 读者)