数据库系统学习 关系代数

首先,学习关系代数的运算(忽略 并、交、差)

 第一点,在基本代数运算中,除去并、交、差,最为重要的就是笛卡尔积,笛卡尔积满足下面性质

广义笛卡儿积        

设有n目关系R, m目关系S       

广义笛卡儿积R×S是n+m目关系(列的个数)

其中:  前n个分量是R的一个元组, 后 m个分量是S的一个元组; 若R有K1个元组 , S有K2个元组,  则R×S 有K1×K2个元组.

在数据库中,最为重要的专门代数运算符有四个,连接(\sigma投影(\tiny \prod连接(\theta除(÷

一、连接(\sigma 

        简单来说就是水平方向选择满足条件的元组,意思就是选择符合条件的行。

举个例子:

比如说学生关系 student(sno,sname,ssex,sage,sdept)

查询信息系(IS系)全体学生 关系代数表达式:    \sigma\tiny sdept = 'IS'\large (Student)

 二、投影(\tiny \prod

         简单来说就是垂直方向筛选符合条件的列

举个例子:

比如说还是对于学生关系student(sno,sname,ssex,sage,sdept)

查询学生的姓名和所在系的关系表达式:\tiny \prod\tiny Sname,Sdept\large (Student)

注意:姓名和所在系是列的关系,所以需要使用投影。

三、连接(\theta

        从两个关系的广义笛卡尔积中选取属性间满足一定条件的元组

注意这里连接是两个关系之间存在运算,上面两个运算都是一个关系中选取符合一定条件的元组。

有两个概念需要注意:

(1)等值连接 :从关系R与S的广义笛卡尔积中选取A、B属性值相等的那些元组,即等值连接,意思就是说,最后做完连接之后会保留相同属性的列

(2)自然连接:等值连接去掉重复属性列,就是将等值连接做一遍去重操作

(3)左外连接:只将左边关系R要舍弃的元组保留

(4)右外连接:只将右边关系S要舍弃的元组保留

(5)外连接:关系R与S的自然连接中,因为一个关系在另一个关系中找不到匹配项而舍弃的元组,也被保留下来, 同时,其它属性置空(Null) 

四、除(÷

如果用定义理解起来,比较困难,所以使用一个样例

                对于一个关系R

ABC

D

abcd
abef
bcef
edef
abde
edcd

                对于一个关系S

        

CD
cd
ef

我们现在需要计算R÷S(注意对于一个关系每一行的数据互不影响,所以可以进行互换位置)

我们注意R关系中的第一行和第二行的CD列可以发现拥有一个S关系并且这两行的AB列是一样的,因此我们可以称这样的对应关系叫做“整除”,因此在R÷S最终的结果中一定拥有ab这个元组,由这个方法可以发现第四行和第六行也存在这样的关系,因此ed也是其中的答案。

因此R÷S的结果就是

AB
ab
ed

其次,最为重要的就是写出每一个关系表达式,因此以下十条表达式,我觉得会自己表达就一定理解了以上的关系运算

设有关系模式: 学生(【学号】,姓名,性别,年龄,系名,籍贯)

课程(【课程号】,课程名,学分,开课时间,先行课号)

选修(【学号,课程号】,成绩)

⑴查询所有年龄>20的男学生信息

分析:这个问题中有年龄和性别两个信息,其实就是选择出符合上述条件的学生信息,注意这里面并没有让你得到其中列的信息,所以就只有选择。

因此这道题的表达式就是:\huge \sigma性别 = '男' \small \wedge年龄 > 20(学生)

⑵查询所有女生的姓名

分析:首先满足一定条件的大概率使用选择,先使用选择选出所有女生,注意这里需要得到每一个女生的姓名,因此需要整个姓名列的信息因此需要投影。

因此这道题的表达式就是:

⑶查询不作为其他课程的先行课的课程号

分析:在表中直接得到的信息是先行课的课程号,那么题目的要求其实就是除了前面说的情况剩下的就是要的答案,思路也就是使用投影得到所有的课程的课程号和先行课的课程号,将总的课程将去先行课的课程号就是答案。

因此这道题的表达式就是:

⑷查询计算机系和机械系学生的情况

分析:满足系名是计算机系和机械系条件的所有学生的情况,因此就是选择出系名等于条件的所有学生,注意使用V或运算符连接两个系名。

因此这道题的表达式就是:

⑸得到一张包括学生学号,课程名称和成绩的学生成绩表

分析:通过这道题可以发现,课程名称和成绩并不在一个表中,分别在课程和选修中,因此需要先使用自然连接,将课程和选修连接起来后,再使用投影得到符合条件的列。

因此这道题的表达式就是:

(6)查询至少选修了一门以C02为先行课程的课程的学生 (学号,姓名)

分析:观察题目可以发现,最后的信息需要学号姓名,但是课程和选修中没有学号和姓名,因此首先需要自然连接三个关系,然后选择出先行课号是C02的课程,最后投影得到学号和姓名。

因此这道题的表达式就是:

 (7)列出选修了全部课程的学生名单

分析:这道题需要获取选修全部课程的学生名单,可以发现在课程关系中并没有学生的名字,在选修中拥有学号和课程号,在学生关系中拥有学生姓名和学号的信息。因此需要一步一步的算,首先肯定需要得到全部的课程的编号,所以在课程关系中进行投影得到所有的课程号,然后在选修关系中使用投影得到每个学号所选课程的课程号,需要得到选修全部课程的学号,使用除,由除的定义可以得到选修全部课程的学号,然后再跟学生关系自然连接一下即可得到结果

因此这道题的表达式就是:

(8)查询选修的所有课程成绩都在80分以上的学生姓名及所在系

分析:考虑反面先看80分以下,先用投影、差和选择筛选出在选修的所有课程中成绩在80分以上的学生,然后在使用连接,连接学生信息,得到需要的答案。

因此这道题的表达式就是:

(9)没有选修‘操作系统’课程的学生姓名

分析:读题可以发现,需要使用学生姓名和课程名称,所以首先先连接三个关系,筛选出选修操作系统的姓名,然后用总的学生姓名的关系减去前者就可以得到答案。

因此这道题的表达式就是:

(10)与‘李小波’同乡的男生姓名及所在系

分析:看见需要相同的时候,就要想到除,首先先筛选出所有男生的姓名,籍贯和所在系,然后使用除将籍贯和李小波相同的学生留下即可得到答案。

因此这道题的表达式就是:

 以上就是全部内容,看完给个免费的赞哦!

  • 18
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值