数据库——关系代数

专门的关系运算

选择
投影
连接

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)连接运算的含义
从两个关系的笛卡尔积中选取属性间满足一定条件的元组

 
A和B:分别为R和S上的属性组
θ:比较运算符 

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  查询没有借过书的读者姓名

π姓名  π读者号 读者) - π读者号 借阅)) 连接 读者)

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注