备战软考数据库:8.2 关系代数

关系代数

操作的分类:

  • 传统的集合操作:并、差、交、笛卡尔积(乘)、笛卡尔积逆运算(除)
  • 扩充的关系操作:投影、选择、联接

5个基本操作:

  1. 并(Union)属于R或属于S的元组,两个关系应该有相同的关系模式
    Rcup S = left{t|tin R tin Sright}
  2. 差(Difference)属于R但不属于S的元组
    R-S=left{t|t in Rwedge tnotin Sright}
  3. 笛卡尔积、乘(Cartesian Product):前r个属性来自于R,后s个属性来自于S
    Rtimes S=left{t|t =<t^r,t^s data-recalc-dims= wedge t^r in R wedge t^s in Sright}" />
  4. 投影(Projection):选择关系的某些属性并且重新排序
    pi_{i_1,dots,i_m}(R)=left{t|t=<t_{i_1},dots,t_{i_m} data-recalc-dims=wedgein Rright}" />
  5. 选择(Selection):满足某条件表达式F的元组
    sigma_{F}(R)=left{t|tin Rwedge F(t)=text{true}right}

4个组合操作:

  1. 交(Intersection):属于R又属于S的元组
    Rcap S=left{t|tin Rwedge tin Sright}
  2. theta联接(Theta Join):RS的笛卡尔积中选择属性值满足某theta操作的元组
    Runderset{itheta j}{bowtie}S = left{t|t=<t^r,t^s data-recalc-dims=wedge t^r in R wedge t^s in S wedge t_{i}^{r}theta t_{j}^{s}right}" />
    Runderset{itheta j}{bowtie}S = sigma_{itheta(r+j)}(Rtimes S)
  3. 自然联接(Natural Join):RS公共属性属性值相同的元组的组合,公共属性值出现一次
    Rbowtie S = pi_{i_1,dots,i_m}(sigma_{R.{A_1}=S.{A_1}wedge dots wedge R.{A_k}=S.{A_k}}(Rtimes S))
    若无公共属性,则为笛卡尔积
  4. 除(Division):
    T=pi_{1,2,dots,r-s}(R)
    W = (Ttimes S) - R
    V = pi_{1,2,dots,r-s}(W)
    Rdiv S = T - V
    Rdiv S=pi_{1,2,dots,r-s}(R)-pi_{1,2,dots,r-s}((pi_{1,2,dots,r-s}(R)times S)-R)

示例:

  • 教师 T(T#, TNAME, TITLE)
  • 课程 C(C#, CNAME, T#)                        T#为外键
  • 学生 S(S#, SNAME, AGE, SEX)
  • 选课 SC(S#,C#,SCORE)
  1. 学习课程号为C2的学生的学号与成绩:
    pi_{text{S#,SCORE}}(sigma_{text{C#='C2'}}(SC))
  2. 学习课程号为C2的学生的学号与姓名:
    pi_{text{S#,SCORE}}(sigma_{text{C#='C2'}}(Sbowtie SC))
  3. 至少选修一门LIU老师的课的学生的学号与姓名:
    pi_{text{S#,SNAME}}(sigma_{text{TNAME='LIU'}}(Sbowtie SCbowtie Cbowtie T))
  4. 选修课程号为C2或C4的学生学号:
    pi_{text{S#}}(sigma_{text{C#='C2'}vee text{C#='C4'}}(SC))
  5. 至少选修了课程号C2和C4的学生的学号:
    pi_1(sigma_{1=4wedge text{2='C2'}wedge text{5='C4'}}(SCtimes SC))
  6. 没有选C2的学生姓名和年龄:
    pi_{text{SNAME,AGE}}(S)-pi_{text{SNAME,AGE}}(sigma_{text{C#='C2'}}(Sbowtie SC))
  7. 学习全部课程的学生姓名:
    查询学生选课情况操作为:pi_{text{S#,C#}}(SC)
    查询全部课程操作为:pi_{text{C#}}(C)
    学了全部课程的学生的学号,用除法操作:pi_{text{S#,C#}}(SC)div pi_{text{C#}}(C)
    最后再用自然联接和投影获得学生的姓名:pi_{text{SNAME}}(S bowtie{pi_{text{S#,C#}}}(SC)div pi_{text{C#}}(C))

2个扩充操作:

  1. 外联接(Outer Join):在做自然联接时,把应该舍弃的元组也放到新关系中,并且在这些元组的新增加属性上插入null值
    还有左外联接和右外联接,分别只保留一侧关系中应该舍弃的元组到新关系中
  2. 外并(Outer Union):两个关系可以不是相同的关系模式,新增属性插入空值

Leave a Reply

Your email address will not be published. Required fields are marked *