• 数据库系统学习 关系代数


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

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

    广义笛卡儿积        

    设有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)与‘李小波’同乡的男生姓名及所在系

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

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

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

  • 相关阅读:
    Kruskal,最短路综合应用,一道图论一
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java智慧小区综合管理平台q1033
    PC端 Rockchip RKNN-Toolkit 连接 Rockchip NPU 设备
    【Linux】进程概念讲解
    使用aggregation API扩展你的kubernetes API
    计算机毕业设计Java电子病历系统(源码+系统+mysql数据库+lw文档)
    代码随想录算法训练营day52||674. 最长连续递增序列||718. 最长重复子数组||1143.最长公共子序列
    c++ || 智能指针
    面试题目:手写一个LRU算法实现
    HTML期末作业 计算机毕业设计——简单的学生网页作业源码 基于HTML品优购项目的设计与实现(7页)
  • 原文地址:https://blog.csdn.net/xp_xht123/article/details/126918691