• 数据库——关系代数


    专门的关系运算

    选择
    投影
    连接


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

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



  • 相关阅读:
    SQL Server 的事务和锁(一)
    Sql server脏读、更新丢失、不可重复读、幻象读问题及解决方案
    Sql server锁机制
    Windows系统变量列表
    windows运行命令大全
    C# 捕获数据库自定义异常
    sql日期函数
    C# ado.net 操作存储过程(二)
    C# ado.net 操作(一)
    url传参特殊字符问题(+、%、#等)
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/10596117.html
Copyright © 2020-2023  润新知