首先,学习关系代数的运算(忽略 并、交、差)
第一点,在基本代数运算中,除去并、交、差,最为重要的就是笛卡尔积,笛卡尔积满足下面性质
广义笛卡儿积
设有n目关系R, m目关系S
广义笛卡儿积R×S是n+m目关系(列的个数)
其中: 前n个分量是R的一个元组, 后 m个分量是S的一个元组; 若R有K1个元组 , S有K2个元组, 则R×S 有K1×K2个元组.
在数据库中,最为重要的专门代数运算符有四个,连接()、投影()、连接()、除(÷)
一、连接()
简单来说就是水平方向选择满足条件的元组,意思就是选择符合条件的行。
举个例子:
比如说学生关系 student(sno,sname,ssex,sage,sdept)
查询信息系(IS系)全体学生 关系代数表达式:
二、投影()
简单来说就是垂直方向筛选符合条件的列
举个例子:
比如说还是对于学生关系student(sno,sname,ssex,sage,sdept)
查询学生的姓名和所在系的关系表达式:
注意:姓名和所在系是列的关系,所以需要使用投影。
三、连接()
从两个关系的广义笛卡尔积中选取属性间满足一定条件的元组
注意这里连接是两个关系之间存在运算,上面两个运算都是一个关系中选取符合一定条件的元组。
有两个概念需要注意:
(1)等值连接 :从关系R与S的广义笛卡尔积中选取A、B属性值相等的那些元组,即等值连接,意思就是说,最后做完连接之后会保留相同属性的列
(2)自然连接:等值连接去掉重复属性列,就是将等值连接做一遍去重操作
(3)左外连接:只将左边关系R要舍弃的元组保留
(4)右外连接:只将右边关系S要舍弃的元组保留
(5)外连接:关系R与S的自然连接中,因为一个关系在另一个关系中找不到匹配项而舍弃的元组,也被保留下来, 同时,其它属性置空(Null)
四、除(÷)
如果用定义理解起来,比较困难,所以使用一个样例
对于一个关系R
A | B | C | D |
a | b | c | d |
a | b | e | f |
b | c | e | f |
e | d | e | f |
a | b | d | e |
e | d | c | d |
对于一个关系S
C | D |
c | d |
e | f |
我们现在需要计算R÷S(注意对于一个关系每一行的数据互不影响,所以可以进行互换位置)
我们注意R关系中的第一行和第二行的CD列可以发现拥有一个S关系并且这两行的AB列是一样的,因此我们可以称这样的对应关系叫做“整除”,因此在R÷S最终的结果中一定拥有ab这个元组,由这个方法可以发现第四行和第六行也存在这样的关系,因此ed也是其中的答案。
因此R÷S的结果就是
A | B |
a | b |
e | d |
其次,最为重要的就是写出每一个关系表达式,因此以下十条表达式,我觉得会自己表达就一定理解了以上的关系运算
设有关系模式: 学生(【学号】,姓名,性别,年龄,系名,籍贯)
课程(【课程号】,课程名,学分,开课时间,先行课号)
选修(【学号,课程号】,成绩)
⑴查询所有年龄>20的男学生信息
分析:这个问题中有年龄和性别两个信息,其实就是选择出符合上述条件的学生信息,注意这里面并没有让你得到其中列的信息,所以就只有选择。
因此这道题的表达式就是:性别 = '男' 年龄 > 20(学生)
⑵查询所有女生的姓名
分析:首先满足一定条件的大概率使用选择,先使用选择选出所有女生,注意这里需要得到每一个女生的姓名,因此需要整个姓名列的信息因此需要投影。
因此这道题的表达式就是:
⑶查询不作为其他课程的先行课的课程号
分析:在表中直接得到的信息是先行课的课程号,那么题目的要求其实就是除了前面说的情况剩下的就是要的答案,思路也就是使用投影得到所有的课程的课程号和先行课的课程号,将总的课程将去先行课的课程号就是答案。
因此这道题的表达式就是:
⑷查询计算机系和机械系学生的情况
分析:满足系名是计算机系和机械系条件的所有学生的情况,因此就是选择出系名等于条件的所有学生,注意使用V或运算符连接两个系名。
因此这道题的表达式就是:
⑸得到一张包括学生学号,课程名称和成绩的学生成绩表
分析:通过这道题可以发现,课程名称和成绩并不在一个表中,分别在课程和选修中,因此需要先使用自然连接,将课程和选修连接起来后,再使用投影得到符合条件的列。
因此这道题的表达式就是:
(6)查询至少选修了一门以C02为先行课程的课程的学生 (学号,姓名)
分析:观察题目可以发现,最后的信息需要学号姓名,但是课程和选修中没有学号和姓名,因此首先需要自然连接三个关系,然后选择出先行课号是C02的课程,最后投影得到学号和姓名。
因此这道题的表达式就是:
(7)列出选修了全部课程的学生名单
分析:这道题需要获取选修全部课程的学生名单,可以发现在课程关系中并没有学生的名字,在选修中拥有学号和课程号,在学生关系中拥有学生姓名和学号的信息。因此需要一步一步的算,首先肯定需要得到全部的课程的编号,所以在课程关系中进行投影得到所有的课程号,然后在选修关系中使用投影得到每个学号所选课程的课程号,需要得到选修全部课程的学号,使用除,由除的定义可以得到选修全部课程的学号,然后再跟学生关系自然连接一下即可得到结果
因此这道题的表达式就是:
(8)查询选修的所有课程成绩都在80分以上的学生姓名及所在系
分析:考虑反面先看80分以下,先用投影、差和选择筛选出在选修的所有课程中成绩在80分以上的学生,然后在使用连接,连接学生信息,得到需要的答案。
因此这道题的表达式就是:
(9)没有选修‘操作系统’课程的学生姓名
分析:读题可以发现,需要使用学生姓名和课程名称,所以首先先连接三个关系,筛选出选修操作系统的姓名,然后用总的学生姓名的关系减去前者就可以得到答案。
因此这道题的表达式就是:
(10)与‘李小波’同乡的男生姓名及所在系
分析:看见需要相同的时候,就要想到除,首先先筛选出所有男生的姓名,籍贯和所在系,然后使用除将籍贯和李小波相同的学生留下即可得到答案。
因此这道题的表达式就是:
以上就是全部内容,看完给个免费的赞哦!