欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

软考 - 软设之关系代数

程序员文章站 2024-01-29 14:30:10
...


两个表

关系R 关系S
SNo SName SDept SNo SName SDept
No0001 Mary 1S No0001 Mary 1S
No0002 Candy 1S No0008 Katter 1S
No0003 Jam 1S No0021 Tom 1S

1. 并: R ⋃ S R \bigcup S RS

将相同的合并,取所有

-- 结果集,不允许重复值
select * from R
UNION
select * from S
> -- 结果集允许重复值
select * from R
UNION ALL
select * from S

R ⋃ S = { t ∣ t ∈ R ⋁ t ∈ S } R \bigcup S = \{ t | t \in R \bigvee t \in S \} RS={ttRtS}

SNo SName SDept
No0001 Mary 1S
No0002 Candy 1S
No0003 Jam 1S
No0008 Katter 1S
No0021 Tom 1S

2. 交: R ⋂ S R \bigcap S RS

只取相同的值

select SNo, SName, SDept FROM R,S WHERE R.SNo=S.SNo
select * from r,s where r.t=s.t

R ⋂ S = { t ∣ t ∈ R ⋀ t ∈ S } R \bigcap S = \{ t | t \in R \bigwedge t \in S \} RS={ttRtS}

SNo SName SDept
No0001 Mary 1S

3. 差: R − S R - S RS

取不相同的,且注意是谁在前,则显示谁的表,本例是R在前,所以以R为主显示,S不显示

R − S = { t ∣ t ∈ R ⋁ t ∉ S } R - S = \{ t | t \in R \bigvee t \notin S \} RS={ttRt/S}

SNo SName SDept
No0002 Candy 1S
No0003 Jam 1S

4. 笛卡儿积: R × S R \times S R×S

乘法结合,两个表各3条记录,相乘则是3×3=9条记录。第一个表的每一条记录与第二个表的所有记录组合

R × S = { t ∣ t = < t n , t m > ⋀ t n ∈ R ⋀ t m ∈ S } R \times S = \{ t | t = <t^n, t^m> \bigwedge t^n \in R \bigwedge t^m \in S \} R×S={tt=<tn,tm>tnRtmS}
< t n , t m > <t^n, t^m> <tn,tm>意思为 t n t^n tn t m t^m tm拼接成一个元组

SNo SName SDept SNo SName SDept
No0001 Mary 1S No0001 Mary 1S
No0001 Mary 1S No0008 Katter 1S
No0001 Mary 1S No0021 Tom 1S
No0002 Candy 1S No0001 Mary 1S
No0002 Candy 1S No0008 Katter 1S
No0002 Candy 1S No0021 Tom 1S
No0003 Jam 1S No0001 Mary 1S
No0003 Jam 1S No0008 Katter 1S
No0003 Jam 1S No0021 Tom 1S

5. 投影: π S N o , S N a m e ( R ) \pi_{SNo,SName}(R) πSNo,SName(R)

等价 π 1 , 2 ( R ) \pi_{1,2}(R) π1,2(R),即投影第1、2个字段(书中叫 元组 t???一行记录??? )的数据

SNo SName
No0001 Mary
No0002 Candy
No0003 Jam

6. 选择: σ S N o = N o 0002 ( R ) \sigma_{SNo=No0002}(R) σSNo=No0002(R)

等价 σ 1 = N o 0002 ( R ) \sigma_{1=No0002}(R) σ1=No0002(R),按行选择R表中的指定字段的数据
注: σ \sigma σ读西格马,希腊文大写为 Σ \Sigma Σ

SNo SName
No0002 Candy

7. 自然连接: R ⋈ S R ⋈ S RS

将两表中各字段连接,且只显示相同字段,去掉重复的字段和不相等的记录

关系R 关系S
SNo SName SDept SNo SAge
No0001 Mary 1S No0001 23
No0002 Candy 1S No0008 24
No0003 Jam 1S No0021 25

7.1. 默认为等值连接 π R . m , S . n . . . ( σ R . m x = S . n y ( R × S ) ) \pi_{R.m,S.n...}(\sigma_{R.m_x=S.n_y}(R \times S)) πR.m,S.n...(σR.mx=S.ny(R×S))

select R.SNo, R.SName, R.SDept, S.SAge from R,S where R.SNo=S.SNo

R.m代表R的所有字段,S.n代表S的所有字段。
m x m_x mx n y n_y ny是指某个字段。
自然连接是不提出明确的连接条件,但 暗含 着一个条件,就是 列名相同的值也相同。在自然连接的结果表中,往往还要合并相同列名的列。当对关系R和S进行自然连接时,要求R和S含有一个或者多个共有的属性。本例中为 R . S N o = S . S N o R.SNo=S.SNo R.SNo=S.SNo(等值连接 R ⋈ S R . S N o = S . S N o \frac{R ⋈ S}{R.SNo=S.SNo} R.SNo=S.SNoRS):只取SNo字段中相同的内容且相同的列只取一列且不相同的SNo不显示,结果如下:

SNo SName SDept SAge
No0001 Mary 1S 23

多列例子: R ⋈ S R . S N o = S . S N o ⋀ R . S N a m e = S . S N a m e \frac{R ⋈ S}{R.SNo=S.SNo \bigwedge R.SName=S.SName} R.SNo=S.SNoR.SName=S.SNameRS

-- 多列的情况下:以下为示例,没有展示出实际的表,假设S中也有SName字段情况下
select R.SNo, R.SName, R.SDept, S.SAge 
from R,S 
where R.SNo=S.SNo
and R.SName=S.SName

注:逻辑符号 π R . m , S . n . . . ( σ R . m x = S . n y ⋀ R . m j = S . n g ( R × S ) ) \pi_{R.m,S.n...}(\sigma_{R.m_x=S.n_y\bigwedge R.m_j=S.n_g}(R \times S)) πR.m,S.n...(σR.mx=S.nyR.mj=S.ng(R×S))

符号 名称
¬ \neg ¬
⋀ \bigwedge
⋁ \bigvee

说明:在广义笛卡尔积R×S中 选出同名属性 上符合相等条件元组(即 公共值相等就连接不相等就删除 ),再进行投影,去掉重复的同名属性(列),组成新的关系。
自然连接是一种特殊的等值链接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。
——
等价: R ⋈ S R . S N o = S . S N o \frac{R ⋈ S}{R.SNo=S.SNo} R.SNo=S.SNoRS = Π R . S N o , . . . , S . S N o , . . . ( σ R . S N o = S . S N o ( R × S ) ) \Pi_{R.SNo,...,S.SNo,...}(\sigma_{R.SNo=S.SNo}(R \times S)) ΠR.SNo,...,S.SNo,...(σR.SNo=S.SNo(R×S))
——
以下示例过程:取R.SNo,R.SName,R.SDept,S.SAge字段,且R.SNo=S.SNo,即 R ⋈ S 1 = 4 \frac{R ⋈ S}{1=4} 1=4RS= Π 1 , 2 , 3 , 5 ( σ 1 = 4 ( R × S ) ) \Pi_{1,2,3,5}(\sigma_{1=4}(R \times S)) Π1,2,3,5(σ1=4(R×S)),数字为字段顺序
注:第5版软设大纲书中有将 π \pi π为大写,根据上下文,个人理解既然是投影,大小写一样。

7.1.1. 第一步:笛卡儿积 R × S R \times S R×S

1 2 3 4 5
SNo SName SDept SNo SAge
No0001 Mary 1S No0001 23
No0001 Mary 1S No0008 24
No0001 Mary 1S No0021 25
No0002 Candy 1S No0001 23
No0002 Candy 1S No0008 24
No0002 Candy 1S No0021 25
No0003 Jam 1S No0001 23
No0003 Jam 1S No0008 24
No0003 Jam 1S No0021 25

7.1.2. 第二步:选择 σ S N o = S N o ( T ) \sigma_{SNo=SNo}(T) σSNo=SNo(T)

T 为笛卡儿积后的新表,等价 σ 1 = 4 ( S ) \sigma_{1=4}(S) σ1=4(S)。进行选择的值是通过笛卡儿积中筛选出SNo进行对比(公共值SNo),只有 R.SNo(No0001)=S.SNo(No0001) 相等,其余的不相同则删除,得到

SNo SName SDept SNo SAge
No0001 Mary 1S No0001 23

7.1.3. 第三步:投影 π 1 , 2 , 3 , 5 ( T ) \pi_{1,2,3,5}(T) π1,2,3,5(T)删除重复的列

SNo SName SDept SAge
No0001 Mary 1S 23

例题

  • 若对关系R(A,B,C,D)和S(C,D,E)进行关系代数运算,则表达式 π 3 , 4 , 7 ( σ 4 < 5 ( R × S ) ) \pi_{3,4,7}(\sigma_{4<5}(R\times S)) π3,4,7(σ4<5(R×S))=______,该表达式与______等价。
关系R 关系S
A B C A B C
3 0 3 3 10 11
2 5 6 4 11 6
5 8 9 5 10 13
8 11 12 6 11 14
  • A.
A B C
3 0 3
4 8 9
  • B.
A B C
8 11 6
8 11 14
  • C.
A B C
5 10 11
5 11 13
  • D.
A B C
2 11 6
2 11 14
  • A. π C , D , E ( σ D < C ( R × S ) ) \pi_{C,D,E}(\sigma_{D<C}(R\times S)) πC,D,E(σDC(R×S))
  • B. π R . C , R . D , S . E ( σ R . D < S . C ( R × S ) ) \pi_{R.C,R.D,S.E}(\sigma_{R.D<S.C}(R\times S)) πR.C,R.D,S.E(σR.DS.C(R×S))
  • C. π C , D , E ( σ R . D < S . C ( R × S ) ) \pi_{C,D,E}(\sigma_{R.D<S.C}(R\times S)) πC,D,E(σR.DS.C(R×S))
  • D. π R . C , R . D , S . E ( σ D < C ( R × S ) ) \pi_{R.C,R.D,S.E}(\sigma_{D<C}(R\times S)) πR.C,R.D,S.E(σDC(R×S))

答案1


  1. B, B ↩︎