关系代数是关系数据库系统查询语言的理论基础。
并、交、差、乘、选择、投影、联接、除、自然联接运算。
五个基本操作:
并(∪)
差(-)
笛卡尔积(×) 投影(σ)
选择(π)
四个组合操作:
交(∩)
联接(等值联接) 自然联接(R
S)
除法(÷)
由关系代数运算经有限次复合而成的式子称为关系代数表达式。这种表达式的运算结果仍然是一个关系。可以用关系代数表达式表示对数据库的查询和更新操作。
关系代数(演算)要求掌握各种语句的应用,多做书中的例题可以帮助自己熟能生巧。
关系代数表达式举例
目的:为了系统在执行时既省时间又能提高效率。
基本策略:先做选择,运用投影去除多余属性等等。
优化算法:语法树(详见教材。尽量提前做选择操作;在每个操作后,应做个投影操作,去掉不用的属性值)
对于一些简单的代数表达式,直接用“尽量提前做选择操作;在每个操作后,应做个投影操作,去掉不用的属性值”直接写出即可。
比如,设有三个关系:
S(S#,SNAME,AGE,SEX)
SC(S#,C#,GRADE)
C(C#,CNAME,TEACHER)
关系代数表达式为:
πS#,SNAME(σGRADE>60(S
SC))
优化为:πS#,SNAME(πS#,SNAME(S)
πS#(σGRADE>60(SC)))
语法树举例
三、关系演算
关系演算(把数理逻辑的谓词演算引入到关系运算中),该理论也应掌握。掌握的深度要求比关系代数略低一些。
-
理解一些量词及符号的含义:
、
、=>、∧、∨、┐
-
元组演算表达式的一般形式为:{t|P(t)}
理解一些量词及符号的含义,理解元组表达式的含义就简单多了(要多作习题):
比如,设有三个关系:
S(S#,SNAME,AGE,SEX)
SC(S#,C#,GRADE)
C(C#,CNAME,TEACHER)
{t|(
u)(C(u)∧C[3]='LIU'∧t[1]=u[1]∧t[2]=u[2])}
可以这样理解:
t是所求元组
对于t ,存在元组U,U是关系C的一个元组并且C的第三个分量是“LIU",t的第一个分量等于U的第一个分量,t的第二个分量等于U的第二个分量
综上,题意:检索LIU老师所授课程的课程号(第一个分量)、课程名(第二个分量)。
域演算表达式的一般形式为:{t1...tk|P(t1...,tk)}
其含义为:这是一个域集合,其中每个域变量的取值关系满足公式P所规定的条件。
元组关系表达式转换成域表达式:
(1)对于k元的元组变量t,引入k个域变量t1...tk,在公式中t用t1...tk替换,元组量t[i]用ti替换。
(2)对于每个量词(
u)或(
u),若u是m元的元组变量,则引入m个新的域变量u1...um。在量词的辖域内,u用u1...um替换,u[i]用ui替换,(
u)用(
u1)...(
um)替换,(
u)用(
u1)...(
um)替换。
比如,{t|(
u)(C(u)∧C[3]='LIU'∧t[1]=u[1]∧t[2]=u[2])}转换为
{t1t2|(
u1)(
u2)(C(u1u2u3)∧u2='LIU'∧t1=u1∧t2=u2)}
表达式的转换不用强记,关键要从语义上理解。
比如,{t1t2|(
u1)(
u2)(C(u1u2u3)∧u3='LIU'∧t1=u1∧t2=u2)}
可以这样理解:
所求结果有t1、t2两个域,存在u1,u2与它们分别相等(u1,u2为关系C中两个域,对应的U3为'LIU')。
综上,题意:检索LIU老师所授课程的课程号(第一个域)、课程名(第二个域)。
四、SQL语言