专门的关系运算

选择
投影
连接

数据库——关系代数-风君雪科技博客

数据库——关系代数-风君雪科技博客

数据库——关系代数-风君雪科技博客

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

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