数据库关系运算

1 关系

1 域( domain)

定义:域是一组具有相同数据类型的值的集和
  例如,自然数、整数、{0,1)、{男,女”(用来表示性别的取值范围)、{学士,“硕士,博士“(表示学位的取值范围)、大于等于0且小于等于100的正整数(用来表示百分制成绩取值范图)长度不超过字节的字符串集合等,都可以是域。
  空值(用null表示)是所有可能的域的一个取值,表名值未知或不存在。例如,对于表示学位的取值域,某员工的学位为空值nul,表示不知道该员工所获得的学位,或该员工没有获得学位;对于表示成绩的取值域,某学生的成绩为空值null,表示不知道该学生的成绩,或该学生没有成绩。

2 笛卡尔积(cartesian product)

定义:给定一组域 D 1 , D 2 , . . . , D n D_1, D_2,...,D_n D1,D2,...,Dn ,它们之中可以有相同的域, D 1 , D 2 , . . . , D n D_1, D_2,...,D_n D1,D2,...,Dn笛卡尔积为:
D 1 × D 2 × . . . . . . × D n = { ( d 1 , d 2 , . . . , d n ) ∣ d i ∈ D i , i = 1 , 2 , . . . . . . , n } D_1\times D_2\times ...... \times D_n=\{(d_1, d_2,...,d_n)|d_i\in D_i, i=1, 2, ......, n \} D1×D2×......×Dn={(d1,d2,...,dn)diDi,i=1,2,......,n}
其中,集合中的每一个元素 ( d 1 , d 2 , . . . , d n ) (d_1, d_2,...,d_n) (d1,d2,...,dn) 成为一个n元组,简称为元组(touple);元素的每一个值 d i d_i di 成为一个分量(component)。

例:给定两个域:
  学生的姓名集合:D1={李小勇,刘方晨,王红敏}
  课程的名称集合:D2={数据库系统概论’,操作系统“}
则D,D2的笛卡儿积为
  D1XD2={(‘李小勇’,‘数据库系统概论’),(‘李小勇’,‘操作系统’)
      (‘刘方晨’,‘数据库系统概论’),(‘刘方晨’,‘操作系统’),
      ('王红敏’,‘数据库系统概论’),(‘王红敏’,‘操作系统’)}
该笛卡儿积的基数M=3×2=6,即D1×D2共有6个元组,如图所示

姓名课程名称
李小勇数据库系统概论
李小勇操作系统
刘方晨数据库系统概论
刘方晨操作系统
王红敏数据库系统概论
王红敏操作系统

3 关系( relation)

定义:D1XD2×…×Dn的子集称为在域D1,D2,…,Dn上的关系,表示为
        r(D1,D2,…,Dn)
其中:表示关系的名字;n是关系的目或度( degree)。
  当n=1时,称该关系为单元关系;当n=2时,称该关系为二元关系。
  关系是笛卡儿积的有限子集,所以关系也是一个二维表,表的每行对应于关系的一个元组,表的每列对应于关系的一个域。由于域可以相同,为了区别就必须给每列起一个名字,称为属性(attribute)。n目关系共有n个属性。
  一般来说,D1,D2,…,Dn的笛卡儿积是没有实际语义的。只有它能够构成一个关系的某个子集才有实际含义。例如,对于上图中的6个元组,如果“李小勇”同学只修读了“数据库系统概论”课,没有修读“操作系统”课,那么第1个元组有实际含义,而第2个元组没有实际含义。因此,我们也称表的一行(即关系的一个元组)是由有关联的若干值成,它对应于现实世界中一个实体的若干属性的值的集合。

2 关系运算

1 选择

  选择操作时在关系r中查找满足给定谓词(即选择条件)的所有元组,记作:
σ p ( r ) = { t ∣ t ∈ r ∧ P ( t ) } \sigma_p(r)=\{t|t\in r\wedge P(t)\} σp(r)={ttrP(t)}

其中:P(predicate)表示谓词(即选择条件),它是一个逻辑表达式,取值为“真”或“假”。

例1:在数据库ScoreDB(Class表)中,查找2015级的所有班级情况
σ g r a d e = 2015 ( C l a s s ) \sigma_{grade=2015}(Class) σgrade=2015(Class)

例2:在数据库ScoreDB(Student表)中,查找所有2000年及以后出生的女学生情况
σ y e a r ( b i r t h d a y ) ≥ ′ 200 0 ′ ∧ s e x = ′ 女 ′ ( S t u d e n t ) \sigma_{year(birthday)\geq '2000'\wedge sex='女'}(Student) σyear(birthday)2000sex=(Student)

2 投影

关系是一个二维表,对它的操作可以从水平(行)的角度进行,即选择操作,也可以从纵向(列)的角度进行,即投影操作。
关系 r 上的投影是从 r 中选出若干属性列组成新的关系。记作:

∏ A ( r ) = { t [ A ] ∣ t ∈ r } \prod_A(r) = \{ t[A] | t\in r\} A(r)={t[A]tr}

其中:A 为关系 r 的属性集合。

例1:在数据库ScoreDB(Student表)中,查找所有学生的姓名和民族

∏ s t u d e n t N a m e , n a t i o n ( S t u d e n t ) \prod_{studentName,nation}(Student) studentName,nation(Student)

例2:在数据库ScoreDB(Student表)中,查找所有“蒙古族”学生的姓名和籍贯
∏ s t u d e n t N a m e , n a t i o n ( σ n a t i o n = ′ 蒙 古 族 ′ ( S t u d e n t ) ) \prod_{studentName,nation}(\sigma_{nation}='蒙古族'(Student)) studentName,nation(σnation=(Student))

3 连接

连接也称也称为 θ \theta θ 连接。假设连接条件为谓词 θ \theta θ ,记为 A o p B A op B AopB ,其中A,B分别为关系 r 和 s 中的度数相等且可比的连接属性集,op 为比较运算符。则 θ \theta θ 连接是从两个关系的笛卡尔积中选取连接属性间满足谓词 θ \theta θ 的所有元组。记作:
r ⋈ θ s = { t r ⋅ t s ∣ t r ∈ r ∧ t s ∈ s ∧ ( r . A o p s . B ) } r\bowtie _{\theta}s=\{t_r\cdot t_s|t_r\in r\wedge t_s\in s\wedge (r.A\quad op\quad s.B)\} rθs={trtstrrtss(r.Aops.B)}

θ \theta θ 运算就是从关系 r 和 s 的笛卡尔积 r × s r×s r×s 中,选取 r 关系在 A 属性集上的值与 s 关系在 B 属性集上的值满足谓词 θ \theta θ 的所有元组,即:
r ⋈ θ s = σ θ ( r × s ) r\bowtie _{\theta}s=\sigma_{\theta}(r\times s) rθs=σθ(r×s)

θ \theta θ 连接运算中有两种最常用、最重要的连接,一种是等值连接(equjoin),另一种是自然连接(natural join)。 θ \theta θ 为等值比较谓词的连接运算称为等值连接。

自然连接是一种特殊的等值连接,它要求两个参与连接的关系具有公共的属性集,即 R ∩ S ≠ ∅ R\cap S\neq \varnothing RS= ,并在这个公共属性集上进行等值连接;同时,还要求将连接结果中的重复属性列去除掉,即在公共属性集中的列中保留一次。
R ∩ S = { A 1 , A 2 , . . . . . . , A k } R\cap S=\{A_1,A_2,......,A_k\} RS={A1,A2,......,Ak},则自然连接可记作:
r ⋈ s = { t r ⋅ t s ∣ t r ∈ r ∧ t s ∈ s ∧ ( r . A 1 = s . A 1 ∧ r . A 2 = s . A 2 ∧ . . . ∧ r . A k = s . A k ) } r\bowtie s=\{t_r\cdot t_s|t_r\in r\wedge t_s\in s\wedge (r.A_1= s.A_1\wedge r.A_2= s.A_2\wedge ...\wedge r.A_k= s.A_k)\} rs={trtstrrtss(r.A1=s.A1r.A2=s.A2...r.Ak=s.Ak)}

例:在数据库ScoreDB中查询所有2016级的“蒙古族”学生的姓名

此查询涉及两个表Student,Class,且两表通过外键classNo关联,因此,自然连接可表示为:
S t u d e n t ⋈ C l a s s = σ S t u d e n t . c l a s s N o = C l a s s . c l a s s N o ( S t u d e n t × C l a s s ) Student\bowtie Class=\sigma_{Student.classNo=Class.classNo}(Student\times Class) StudentClass=σStudent.classNo=Class.classNo(Student×Class)

因此,最后的查询为:
∏ s t u d e n t N a m e ( σ n a t i o n = ′ 蒙 古 族 ′ ( S t u d e n t ) ⋈ σ g r a d e = 2016 ( C l a s s ) ) \prod_{studentName}(\sigma_{nation='蒙古族'}(Student)\bowtie \sigma_{grade=2016}(Class)) studentName(σnation=(Student)σgrade=2016(Class))

= ∏ s t u d e n t N a m e ( σ S t u d e n t . c l a s s N o = C l a s s . c l a s s N o ( σ n a t i o n = ′ 蒙 古 族 ′ ( S t u d e n t ) × σ g r a d e = 2016 ( C l a s s ) ) ) =\prod_{studentName}(\sigma_{Student.classNo=Class.classNo}(\sigma_{nation='蒙古族'}(Student)\times \sigma_{grade=2016}(Class))) =studentName(σStudent.classNo=Class.classNo(σnation=(Student)×σgrade=2016(Class)))

= ∏ s t u d e n t N a m e ( σ S t u d e n t . c l a s s N o = C l a s s . c l a s s N o ( σ n a t i o n = ′ 蒙 古 族 ′ ∧ g r a d e = 2016 ( S t u d e n t × C l a s s ) ) ) =\prod_{studentName}(\sigma_{Student.classNo=Class.classNo}(\sigma_{nation='蒙古族'\wedge grade=2016}(Student\times Class))) =studentName(σStudent.classNo=Class.classNo(σnation=grade=2016(Student×Class)))

= ∏ s t u d e n t N a m e ( σ S t u d e n t . c l a s s N o = C l a s s . c l a s s N o ∧ n a t i o n = ′ 蒙 古 族 ′ ∧ g r a d e = 2016 ( S t u d e n t × C l a s s ) ) =\prod_{studentName}(\sigma_{Student.classNo=Class.classNo\wedge nation='蒙古族'\wedge grade=2016}(Student\times Class)) =studentName(σStudent.classNo=Class.classNonation=grade=2016(Student×Class))

= ∏ s t u d e n t N a m e ( σ n a t i o n = ′ 蒙 古 族 ′ ∧ g r a d e = 2016 ( σ S t u d e n t . c l a s s N o = C l a s s . c l a s s N o ( S t u d e n t × C l a s s ) ) ) =\prod_{studentName}(\sigma_{nation='蒙古族'\wedge grade=2016}(\sigma_{Student.classNo=Class.classNo}(Student\times Class))) =studentName(σnation=grade=2016(σStudent.classNo=Class.classNo(Student×Class)))

= ∏ s t u d e n t N a m e ( σ n a t i o n = ′ 蒙 古 族 ′ ∧ g r a d e = 2016 ( S t u d e n t ⋈ C l a s s ) ) =\prod_{studentName}(\sigma_{nation='蒙古族'\wedge grade=2016}(Student\bowtie Class)) =studentName(σnation=grade=2016(StudentClass))

  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值