1、代数和逻辑查询语言 P161 4.6节,5.1 关系代数操作(1),关系代数的传统定义 一个元组集合(即关系),能用来进行典型的基于关系的查询 集合上的五个操作:并、差、笛卡尔积、选择、投影 在基本操作上定义的附加操作:各种连接 关系代数的操作规则对于集合和包是不一样的 简单的说,包是以空间代价换取时间效率 所以对一般小例子来说,包的综合效率更高 但对实际应用中的数据库来说,用集合更加合理,5.1 关系代数操作(2),关系中的集合操作 基本集合操作:并、交、差 应用到关系操作时,需要附加约束 属性列表和属性类型必须一致 属性的排列顺序也要一致 原则上属性名也要对应一致,如果不一致,需要利用重命
2、名操作处理,5.1 关系代数操作(3),投影A1,A2,An(R) 只保留指定部分列 由于属性减少,元组可能会重值,进而合并,因此数目可能减少 选择C(R) 该操作产生的新关系的元组必须满足条件C 结果关系和原关系的模式相同,5.1 关系代数操作(4),笛卡尔积 RS 一个有序对的集合,有序对的第一个元素来自R,第二个元素来自S 一般地,笛卡尔积对应一个关系,其元组维度更大,个数更多 如果R和S有重名属性,则在结果中加前缀区分 连接操作 参与连接操作的一般是两个关系,且连接时相应的元组在某些方面具有一致性,连接分为三类 全连接即笛卡尔积 自然连接 连接,6,5.2 包上的关系操作(1),一组元
3、素的一种聚集形式,允许重复元素出现,而集合set中不允许元素重复出现。 对一个包去掉其中重复元素,就可得到一个集合。 一个集合可认为是一个特殊的包,其中没有重复元组。,什么是包bag,7,为何需要包,关系中的元组应该不重复,但经运算得到的新关系中的元组可以重复;数据库系统支持 提高投影计算效率 对聚合运算有用(汇总值、平均值、计数等),5.2 包上的关系操作(2),包上的运算:集合并(交、差)、投影、选择、乘积和连接等都允许运算之前和之后元组重复 对两个关系求并,集合方式要先合并再去重,而包方式只合并不去重,所以效率更高 投影操作后不去重 对后面要出现的聚集操作来说,只能用包方式,用集合方式的
4、话会出现逻辑错误。 例:求投影后A属性的平均值,包的并、交、差设R和S是包,若元组t在R和S中分别出现n次和m次 (这里的m和n可以是0),则: R S的包并操作结果中:元组t出现m+n次; R S的包交操作结果中:元组t出现 min (m, n)次; R-S的包差操作结果中:元组t出现 max(0, n-m)次; /减后为负数则取0,包的并、交、差举例:设关系R、S如下:,RS:,RS:,R-S:,R =,S =,5.2 包上的关系操作(3),集合上的包操作(文本框内容释义) 如果对两个集合R、S进行基于包的交和差操作,其结果与集合方式运算一样 因为作为被处理对象的两个关系本身没有重复的元组
5、,所以交或差之后结果中仍然没有重值元组 但对两个集合R和S,进行基于包的并操作,其操作结果可能不再是集合 结论:必须看清(答题)/声明(出题)是包方式还是集合方式,5.2 包上的关系操作(4),关于包的代数定律 并运算的交换律对包和集合都成立RS= SR 差运算对并的分配律只适用于集合而不能适用于包(RS)-T= (R-T) (S-T) 假设R,S和T各有元组t的一个副本 包的投影操作 和集合操作基本一致,只是不再需要去重 包的选择操作 也是不需要去重,R =,5.2 包上的关系操作(5),包的笛卡尔积 一样,不去重包的连接 自然连接 连接,R =,S =,RS=,R S=,5.3 关系代数的
6、扩展操作(1),1.消除重复 清除包中的重复元素,只保留一个副本在关系中 2.聚集操作 独立于同一关系中的其它元组而对某些元组进行运算 3.分组 根据元组的值对他们在一个或多个属性上分组 4.排序 根据一个或多个属性对关系的元组来排序 5.扩展投影 以原有的列作为参数来计算,并产生新的列 6.外连接运算 连接运算的变体,防止了悬挂元组的出现,消除重复 将包转化为集合(R) 例5.8,R,(R),聚集操作符汇总或“聚集”关系中某一列出现的值 SUM用来产生一列总和,得到的是一个数字值 AVG用来产生一列平均值,结果也是数字值 MAX和MIN当用于数字值列的时候,产生的分别是这一列中最大的和最小的
7、值;当应用于字符列的时候产生是字典序的最大者和最小者 COUNT产生一列中的“值”的数目(并不一定指不同的值)。同样,COUNT应用于一个关系的任何属性时,产生的是这个关系的元组数,包括重复的元组,17,例子,考虑关系,1. SUM(B)=2+4+2+2=10 2. AVG(A)=(1+3+1+1)/4=1.5 3. MIN(A)=1 4. MAX(B)=4 5. COUNT(A)=4,分组 为什么要分组分组是便于各分组中元组的聚集操作。 如何分组算符的下标是一个元素的列表,其中每个元素是下列情况之一:是应用操作的那个关系的一个属性,这个属性是那些可以把R分组的属性其中之一。这个元素称为分组属
8、性。应用到关系的一个属性上的聚集操作符。为了在结果中对应此聚集,给属性一个名称,一个箭头和一个新的名字附在这个聚集的后面,称为聚集属性。,分组操作符L(R) 分组操作符的下标是一个元素的列表L,可以是: 应用操作的关系的一个属性,R使用这个属性分组,称为分组属性;例如:图5-4 studioname(Movies) 应用到关系的一个属性上的聚集操作符,可以使用箭头给聚集属性列命名;例如:studioname,SUM(length)sumOFLength(Movies),表达式L(R) 的求解过程 根据L中的分组属性,按照该属性上的不同取值进行分组 对每一组,产生一个元组,其属性和属性值按照L取
9、 L中的分组属性 | 该组在分组属性上的值 L中的属性聚集结果(箭头右侧属性)例5.23 对关系StarsIn( title, year, starName),查询至少出演 了三部电影的影星,以及他们在电影中出现的最早年份。starname,MIN(year)minYear, COUNT(title) ctTitle (StarsIn)先聚集,再选择,最后投影得到结果,设关系student(学生)、course(课程)和sc(成绩)如下:,分组操作符举例 1、查询各个专业的学生人数及平均年龄2、统计各门课的平均成绩、最高成绩、最低成绩及选修人数3、查询被两个以上同学选修的课程的课程名及平均成绩
10、, sdept,count(sno) snum, avg(sage)avgage(student) 注意:分组后取出姓名、学号、性别是没意义的,扩展的投影操作符 L(R) 扩展投影是在投影的基础上增加一些计算操作作为投影列表; 投影列表可以是: 关系R的一个属性; 形如xy的表达式:将R中的属性x重命名为y; 形如E z的表达式,其中E是一个涉及R的属性、常量、算术运算符或者串运算符表达式,z是表达式E计算结果的属性的新名字。,例子,设有关系R,A,B+CX(R),B-AX,C-BY(R),排序操作L(R),表达式L(R),其中R是关系,L是R中的某些属性的列表。这个表达式表示的就是关系R的本
11、身,只是结果中的所有元组是按L来排序的。 设L是由A1,A2,An组成,那么R的元组就先按A1的值排序,对于A1属性相等的元组则按A2的值排序,依次类推。,外连接,连接操作的缺陷连接操作的一个性质是可能产生悬挂元组。而这些元组不能跟另外关系的任何一个元组匹配,所以这种连接操作并不能完全反映原始关系的全部信息。 什么是外连接先计算两个关系R和S的自然连接,然后再把来自R或S的悬浮元组加入其中,用null的表示符号 补齐结果元组中那些不具有值的属性。我们称之为外连接,用符号 表示。,27,设有关系,U,V,U V,外连接的不同变体,只是将左变量R的悬浮元组补齐 加入到结果中,称之左外连接,用符号R
12、 LS表示。 只是将右变量S的悬浮元组补齐 加入到结果中,称之左外连接,用符号R RS表示。 外连接的操作是,先进行连接,然后将那些不能匹配其他关系的元组,也用 补齐,用U CV表示一个带条件C的外连接。同样,可用L或R来修饰这个算符,使其表示的左外连接或右外连接。,29,U LV,U RV,U AV.CV,P125 习题 4.6.14.6.4 a) h)4.6.5 a),随着数据技术的不断提高,关系代数也暴露出了一些局限性,例如,无法有效地表示递归运算、逻辑表达能力弱等。 在这种情况下,Datalog语言应运而生。Datalog语言是一种基于逻辑编程语言Prolog的一种非过程化的语言。同关
13、系演算类似,用户只需要给出所描述的信息,不需要给出获取信息的具体过程。 本节介绍Datalog语言的基本结构、规则、递归编程以及从关系代数到Datalog语言的转换等内容。,5.4 关系逻辑(1),基本概念,逻辑也是一种表示关系查询的方法,例如Datalog语言就可以表示相同类型的查询。 Datalog语言不是使用过程语言来表示查询,而是使用一种规则来表示出这种想法,即可以通过已知的关系中的某些元组的组合来推测元组是否在关系中。,基本结构,Datalog语言包括两种基本的原子,即关系原子和算术原子,由原子按照一定的规则组成Datalog查询语句。 在Datalog语言中,关系通过 “谓词”来表
14、示,每一个谓词都有固定数量的参数。 关系原子是由符号谓词和其后的参数组成,常简称原子。例如,如果谓词是R,其参数分别是t1,t2,tn,那么R(t1,t2,tn)就是一个关系原子。 算术原子是两个算术表达式的比较,算术原子的值是布尔值。,一般规则,规则是Datalog语言中描述原子之间关联的规范,包括下列三个组成部分: 1. 一个称为头部的关系原子,其后是 2. 左向箭头符号,读作if,其后是 3. 主体部分,由一个或多个称为子目标的原子组成。子目标既可以是关系原子,也可以是算术原子。各个子目标之间用逻辑运算符AND连接,且各个子目标前面可以有选择地增加取反逻辑运算符NOT。 规则的目标是使规
15、则的头部关系原子为真。 例如:LongMovie(t,y)Movies(t,y,l,g,s,p) AND l100 等价于LongMovie:=title,year(length) 100(Movies),安全规则,安全规则: 由于关系实例总是有限,所以还需要由规则保证得到的头部关系也都是有限的。 每个在规则中任意位置出现的变量都必须出现在主体的某些非否定的关系子目标中。 尤其是,任何在规则头部、否定关系子目标或任意算术子目标中出现的变量,也必须出现在主体的非否定的关系子目标中。,例5.19 安全规则LongMovie(t,y)Movies(t,y,l,g,s,p) AND l100 例5.2
16、0 非安全规则,不允许出现在Datalog中P(x,y)Q(x,z) AND NOT R(w,x,z) AND xy,扩展谓词和内涵谓词,若谓词所指的关系存储在数据库中,称该谓词为扩展谓词。 当谓词所指的关系是通过一个或多个Datalog规则计算得到的,称该谓词是内涵谓词。 扩展谓词和内涵谓词分别对应关系代数表达式中的操作数和使用关系代数表达式计算得到的关系。 在Datalog规则中,可以使用EDB(External Database,扩展数据库)表示扩展谓词或相应的关系,使用IDB(Internal Database,内涵数据库)表示内涵谓词或相应的关系 。例如,Movies是一个EDB关系
17、,而LongMovie是一个IDB关系。,5.5 关系代数向Datalog规则的转换,一般地,可以使用一个或多个Datalog规则来模拟关系代数的运算形式,并且可以模拟非常复杂的运算形式。 本节主要研究如何从关系代数的基本运算形式以及连接运算形式转换到Datalog规则。,从集合运算到Datalog规则,交集运算可以使用一个Datalog规则来表示。由于交集运算涉及了两个关系,那么在Datalog规则中,具有与两个关系对应的子目标。在规则中,相应的参数使用相同的变量。假设R和S的关系模式是R(A,B,C)和S(A,B,C), 则RS可以使用规则:I(a, b, c) R(a, b, c) AN
18、D S(a, b, c),并集运算使用两个规则来表示,每个规则对应着一个并集运算中的关系,且两个规则的头部都有相同的IDB谓词。头部的参数与各个子目标中的参数完全相同。假设R和S的关系模式是R(A,B,C)和S(A,B,C), 则R S可以使用规则:U(x, y, z) R(x, y, z)U(x, y, z) S(x, y, z) 或U(a, b, c) S(a, b, c) 注意:变量名对于规则是局部的,即每条规则是独立计算的,并且向其头部关系提供元组,与其他规则无关,因此变量名是独立于规则的。,差集运算可以使用具有求反子目标的一个规则来计算。即如果计算两个关系U和V的差集,非求反子目标是
19、谓词U,求反子目标是谓词V。 在该规则中,子目标和头部对于相应的参数都有相同的变量。假设R和S的关系模式是R(A,B,C)和S(A,B,C), 则R-S可以使用规则:D(a, b, c) R(x, y, z) AND NOT S(x, y, z),从投影运算到Datalog规则,将关系代数中的投影运算转换成Datalog规则,可以使用一个具有单一子目标的规则。该子目标的参数是不同的变量,每个变量代表关系的一个属性。 头部是带有参数的原子,其参数按照期望顺序对应于投影列表的属性。例5.25 将关系Movies (title, year, length, genre, studioName, pr
20、oducerC#)投影到前三个属性:P(t,y,l) Movies(t,y,l,g,s,p),从选择运算到Datalog规则,如果选择条件是一个或多个算术比较表达式的AND运算,可以建立一个具有下列子目标的Datalog规则: 一个关系子目标对应于将其进行选择的关系。该关系子目标的每个分量都有不同的变量,且每个分量都对应关系的一个属性; 多个算术子目标,每个算术子目标对应选择条件的一个比较运算。虽然在选择条件中使用属性名,但是在算术子目标中却使用相应的变量,并且与关系子目标中建立的变量保持一致。 复杂条件可以将逻辑表达式转化成“析取范式”,即正负文字的合取的析取。,例5.26 length10
21、0 and studioName=Fox (Movies) S(t,y,l,g,s,p) Movies(t,y,l,g,s,p) AND l 100 and s=Fox 例5.27 length100 or studioName=Fox (Movies) S(t,y,l,g,s,p) Movies(t,y,l,g,s,p) AND l 100 S(t,y,l,g,s,p) Movies(t,y,l,g,s,p) AND s=Fox 例5.28 NOT(length100 or studioName=Fox) (Movies) 根据狄摩根定律,等价于(NOT(length100) AND (NO
22、T (studioName=Fox)) (Movies)即length100 AND studioNameFox (Movies) 再转化为Datalog规则: S(t,y,l,g,s,p) Movies(t,y,l,g,s,p) AND l100 and s Fox,从笛卡尔乘积到Datalog规则,RS可以使用单一的Datalog规则来表示,规则包含两个子目标,一个对应R一个对应S,两个子目标有不同的变量分别对应R和S的属性。 头部IDB谓词拥有所有在这两个子目标中出现的参数,R子目标中的变量列在S子目标中变量的前面。p(a,b,c,x,y,z) R(a,b,c) AND S(x,y,z)
23、,从连接运算到Datalog规则,自然连接R S使用一条近似于笛卡尔积的Datalog规则来表示,区别在于R和S的同名属性使用相同的变量,否则使用不同的变量。 规则头部是一个IDB谓词,它的每个变量出现一次。假设R和S的关系模式是R(A,B)和S(B,C,D),则自然连接 R S 可以用规则J(a,b,c,d) R(a,b) AND S(b,c,d),连接先对笛卡尔积进行转化,再对选择条件进行转化。例5.32 考虑关系U(A,B,C)和V(B,C,D),其连接对应的Datalog规则:J(a,ub,uc,vb,vc,d) U(a,ub,uc) AND V(vb,vc,d) AND ad AND
24、 ubvb例5.33 J(a,ub,uc,vb,vc,d) U(a,ub,uc) AND V(vb,vc,d) AND ad J(a,ub,uc,vb,vc,d) U(a,ub,uc) AND V(vb,vc,d) AND ubvb,从多重运算到Datalog规则,关系代数中的单一运算形式可以使用Datalog规则表示,而且多重运算也可以使用Datalog规则模拟。 模拟多重运算的步骤如下: 绘制关系代数的表达树。其中,表达树就是使用树状结构表示关系代数表达式的计算程序。 为表达树的每一个内部节点建立一个IDB谓词。IDB谓词的一条或多条规则对应树节点上需要使用的算子。 树的扩展操作数由对应谓
25、词表示,作为内部节点的操作数则由对应的IDB谓词表示。 代数表达式的结果就是与表达树的根关联的谓词的关系。,包的逻辑运算,包的运算不仅可以用于关系代数,而且也可以用于Datalog规则。即如果没有求反的关系子目标,那么包的投影、选择、乘积和连接等运算形式可以同样应用于Datalog规则。 将包的运算应用于Datalog规则时,其运算步骤如下: 第一步,对不同子目标对应的关系进行包连接运算; 第二步,按照算术子目标包含的内容,对连接运算的结果进行包选择运算; 第三步,把选择结果按照规则头部的关系进行包投影运算。H(x,z) R(x,y) AND S(y,z),R=,S=,H=,Datalog与关
26、系代数的比较,基本关系代数的每一种操作都可以用Datalog查询表达,但扩展关系代数中的分组和聚集等操作无法用Datalog表达。 任何单个Datalog规则都可以用关系代数表达,但Datalog可以表达递归,而关系代数不能。 由于IDB谓词也可以在主体中出现,于是规则头部的元组可以反馈到规则主体,从而为头部生成更多的元组。 例5.35 假定关系Edge(X,Y),表示从节点X到节点Y直接存在一条边,关系Path(X,Y)表示从节点X到节点Y存在一条长度至少为1的路径,则描述边的传递闭包为:Path(X,Y) Edge(X,Y)Path(X,Y) Edge(X,Z) AND Path(Z,Y),P146 习题 4.3.1 d) g)4.3.2 b) e)4.3.5 a),