数据库——关系代数
专门的关系运算选择投影连接除STUDENT(Sno,Sname,Ssex,Sage,Sdept)//学生表COURSE(Cno,Cname,Cpno,Ccredit)//课程表SC(Sno,Cno,Grade) //选课表1. 选择(Selection)选择又称为限制(Restriction)选择运算的含义在关系中选择满足给定条件的诸元组选择运算符σ[例1] 查询信息系(IS系)全体学生σ Sde
专门的关系运算
选择
投影
连接
除
STUDENT(Sno,Sname,Ssex,Sage,Sdept)//学生表 COURSE(Cno,Cname,Cpno,Ccredit)//课程表 SC(Sno,Cno,Grade) //选课表
1. 选择(Selection)
选择又称为限制(Restriction)
选择运算的含义
在关系中选择满足给定条件的诸元组
选择运算符σ
[例1] 查询信息系(IS系)全体学生
σ Sdept = 'IS' (Student)
[例2] 查询年龄小于20岁的学生
σ Sage < 20(Student)
[例3] 查询信息系年龄小于20岁的学生
σ Sdept = 'IS' ∧ Sage < 20(Student)
∧ 逻辑与
∨ 逻辑或
注:选择运算是从行的角度进行的运算
2. 投影(Projection)
1)投影运算的含义
从R中选择出若干属性列组成新的关系
投影运算符π
2)投影操作主要是从列的角度进行运算
但投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)
3) 举例
[例1] 查询学生的姓名和所在系
即求Student关系上学生姓名和所在系两个属性上的投影
π Sname,Sdept(Student)
[例2]查询学生关系Student中都有哪些系
π Sdept(Student)
[例3] 查询CS系的学生姓名
π Sname(σSdept='CS'(Student) )
[例4] 查询没有选过课的学号
思路:所有学生号-选过课的学生号
π Sno(Student)- π Sno(SC)
[例5]查询没有不及格的学号
思路:所有学号-有不及格的学号
π Sno(Student)- π Sno(σGrade < 60 (SC))
查询没有不及格的学号
这样做有错, 为什么?
π Sno(σGrade>= 60 (SC))
这是查询有过及格的学号!!!
[例6]查未被选修的课号
所有课号 - 被选修的课号
π cno(Course) -π cno(SC)
3. 连接(Join)
1)连接运算的含义
从两个关系的笛卡尔积中选取属性间满足一定条件的元组
A和B:分别为R和S上的属性组
θ:比较运算符
2)两类常用连接运算
等值连接(equijoin)
θ为“=”的连接运算称为等值连接
自然连接(Natural join)
两关系中相同属性组的等值连接
结果中去掉重复属性列
[例 1]查询有成绩>95的学号,姓名
分析:成绩在SC表中, 姓名在STUDENT表中
如果有一张大表,有学号、姓名、成绩 就好了
自然连接STUDENT和SC即可
π Sno,Sname (σgrade>95(Student连接SC) )
问题:什么时候要用到连接运算?
结论:当查询条件和结果来自两个关系时, 用连接
[例 2] 查询选修了2号课程的学生的学生名。
π Sname(σCno=‘2’(Student 连接 SC ))
[例3] 查询选修了先行课为5号课的课程的学生姓名。
π Sname(σ Cpno='5'(Student 连接 SC 连接 Course))
或
π Sname(π Sno,Sname(Student) 连接 SC 连接 σCpno='5'(Course))//性能更好
[例4] 查询没有选过课的学号,姓名
π Sno,Sname (Student 连接 (πSno(Student) - πSno(SC)) )
关系代数查询
三部曲
(1)连接
(2)选择
(3)投影
关系代数查询思路总结
首先确定查询哪个表
当查询内容和条件来自多个表时---多表查询,用自然连接
查询条件?用选择σ
查询内容?用投影π
三部曲:连接---选择---投影
题型“查询没有...”,用差运算-
所有… - 有…
练习题:
1.查询CS系的学生姓名
投影 Sname(选择 Sdept=’cs’( Student))
2.查询有成绩>90的学号
投影 Sno 选择 Grade90(c))
3.查询没有被选修的课号
投影Cno(Course)-投影cno(sc)
4.查询没有被选修的课号,课名
投影 Cno, Cname(Course连接(投影Cno( Course)-投影cno(Sc)
5.查询CS系成绩〉90的学号,姓名
投影sno, Sname选择 Sdept='cs'( Student)连接选择 Grade>90(sC)连接 Student)
6.查询数据库原理课成绩〉90的学号
投影 sno(选择 Cname='数据库原理'(Course)连接 选择Grade>90(sc))
7.查询CS系数据库原理课成绩〉90的学号,姓名
投影 Sno, Sname(选择 Cname='数据库原理'( Course)连接 选择 Grade>90 (Sc )连接 Student)
4 除运算
这里先引入一个象集的概念。
象集(Image Set)
关系R(X , 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得到一个新的关系P(X):
如果R中某元组在X上分量值x的象集Yx包含S , 则由x组成的元组就是P的元组。
R÷S = {x | S 真包含于 Yx }
Yx:x在R中的象集
[例1] 查询至少选修1号课程和3号课程的学生号码
这样写对吗?
π Cno(σ CNO=1 ∧ cno=2(SC))
这是不对的,因为没有一条选课记录既选择了1号课又选择了2号课。
思路:
查询这样的学号,该学号对应的选课课号集合包含1号课和3号课的,我们就要先构造这个集合
首先建立一个临时关系K:
k = πCNO(σ CNO=1 V CNO=3(SC))
然后求:
π Sno,Cno(SC)÷K
在这里的
πSno,Cno(SC)
是
95001象集{1,2,3}, 包含K
95002象集{2,3}, 不包含K
于是:
π Sno,Cno(SC)÷K = {95001}
[例2] 查询选修了全部课程的学生号码。
查询πSno,Cno(SC)中学号, 象集包含什么?
π Sno,Cno(SC)÷ π Cno(Course)
扩展:查询选修了全部课程的学生号码和姓名。
π Sno,Sname((π Sno,Cno(SC)÷π Cno(Course))连接Student))
[例3]查询选修了95002所选全部课程的学生号码
π Sno,Cno(SC)÷π Cno(σ SNO=95002 (SC))
练习题:
1.查询选修了全部课程的学生号码
投影sno,cno(sc)÷投影cno( Course)
2.查询选修了全部课程的学生号码和姓名
投影sno, Sname((投影sno,cno(sc)÷投影cno( ourse))连接 Student)
3.查询被所有学生选修的课程号
投影cno ,sno(sc)÷投影sno( Student)
4.查询被所有学生选修的课程号,课名
投影cno, Cname(投影Cno,sno(sc)÷投影Cno( Student)连接 Course)
5.查询选修了95002所选全部课程的学生号码
投影sno,cno(Sc)÷投影cno(选择sno=95002(sc))
6.查询选修了刘晨所选全部课程的学生号码
投影sno,cno(sc)÷投影Cno(选择 Sname=刘晨’(sc连接 Student))
5.综合实例应用
图书管理数据库有关系模式:
图书(书号,书名,价格,作者)
读者(读者号,姓名,性别,年龄)
借阅(读者号,书号,借日期,还日期,罚款金额)
1 查询价格大于50的书名和作者名
π 书名,作者名(σ 价格>50(图书))
2 查询(一次)罚款金额>20元的读者名
π 姓名(σ 罚款金额>20(借阅 连接 读者))
3查询被年龄大于60的读者借过的书名和作者名
π 作者,书名 (σ 年龄者>60 (读者 连接 借阅 连接 图书 ))
4 查看了所有书的读者名
π 姓名(( π 读者号,书号(借阅) ÷ π 书号(图书)) 连接 读者)
5 查看了‘张三’所看过的所有书的读者名
π姓名( π 读者号,书号(借阅) ÷ π书号(σ 姓名=‘张三’ (读者 连接 借阅)) 读者)
6 查询没有借过书的读者姓名
π姓名( ( π读者号 (读者) - π读者号 (借阅)) 连接 读者)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)