文章目录
第五章 代数和逻辑查询语言
5.1 包 Multiset
包的定义
-
定义:即多集, Multiset。同一个元组可以在关系中多次出现。
-
使用包的优点:
- 提高并操作和投影操作的效率。
- 对聚合运算(SUM, COUNT等)有用(聚合运算不能使用集合方式,会产生逻辑错误)。
包上的关系操作
-
包上的运算都允许运算之前和运算之后元组重复。
-
注意事项:
-
集合上的包操作
如果对两个集合 R、S 进行基于包的交和差操作,其结果与集合方式运算一样。 -
因为作为被处理对象的两个关系本身没有重复的元组,
所以交或差之后结果中仍然没有重复元组
但对两个集合 R 和 S,进行基于包的并操作,其操作结果可能不再是集合。
- 注意:看清(答题)/声明(出题)是包方式还是集合方式
-
-
关于包的的代数定律
- 交换律:S ∪ R = R ∪ S。
-
包上的关系操作:
-
包的并、交、差
设R和S是包,若元组t在R和S中分别出现m次和n次(这里的m和n可以是0),则:
- R ∪ S的包并操作结果中:元组t出现 m+n 次;
- R ∩ S的包交操作结果中:元组t出现 min (m, n) 次;
- R - S的包差操作结果中:元组 t 出现 max(0, m-n) 次。
-
包的投影操作
和集合投影基本一致,但是不需要再去重。
-
包的选择操作
-
包的笛卡尔积
-
包的连接
-
自然连接
-
θ 连接
-
-
5.2 关系代数的扩展操作符
-
消除重复 δ ( R ) δ(R) δ(R)
清除包中的重复元素
-
聚集操作 ( SUM, AVG, MAX|MIN, COUNT \text{SUM, AVG, MAX|MIN, COUNT} SUM, AVG, MAX|MIN, COUNT)
独立于同一关系中的其它元组而对某些元组进行计数、求最大值、最小值、平均值等运算- SUM用来产生一列总和,得到的是一个数字值;
- AVG用来产生一列平均值,结果也是数字值;
- MAX和MIN当用于数字值列的时候,产生的分别是这一列中最大的和最小的值;当应用于字符列的时候产生是字典序的最大者和最小者;
- COUNT产生一列中的“值”的数目(并不一定指不同的值)。同样,COUNT应用于一个关系的任何属性时,产生的是这个关系的元组数,包括重复的元组。
-
分组 γ L ( R ) \gamma_L(R) γL(R)
根据元组的值对他们在一个或多个属性上分组-
应用 γ γ γ 操作的关系的一个属性,R使用这个属性分组,称为分组属性;
-
例如:图5-4 γ s t u d i o n a m e ( M o v i e s ) γ_{studioname}(Movies) γstudioname(Movies)
studioName Disney Disney MGM MGM
-
-
应用到关系的一个属性上的聚集操作符,可以使用箭头给聚集属性列命名;
-
例如: γ s t u d i o n a m e , S U M ( l e n g t h ) → s u m O f L e n g t h ( M o v i e s ) γ_{studioname,SUM(length)\rightarrow sumOfLength}(Movies) γstudioname,SUM(length)→sumOfLength(Movies)
studioName sumOfLength Disney 12345 MGM 54321
-
-
应用的例子
例5.23 对关系StarsIn( title, year, starName),查询至少出演了三部电影的影星,以及他们在电影中出现的最早年份。
-
-
排序 τ L ( R ) \tau_L(R) τL(R)
根据一个或多个属性对关系的元组排序。- 表达式 τ L ( R ) τ_L(R) τL(R),其中R是关系,L 是 R 中的某些属性的列表。这个表达式表示的就是关系R的本身,只是结果中的所有元组是按L来排序的。
- 设 L 是由 A 1 , A 2 , … , A n A_1,A_2,…,A_n A1,A2,…,An 组成,那么 R 的元组就先按 A 1 A_1 A1 的值排序,对于 A 1 A_1 A1 属性相等的元组则按 A 2 A_2 A2 的值排序,依次类推。
-
扩展投影 π L ( R ) \pi_L(R) πL(R)
- 扩展投影是在投影的基础上增加一些计算操作作为投影列表;
- 投影列表可以是:
- 关系R的一个属性;
- 形如x→y的表达式:将R中的属性x重命名为y;
- 形如E→z的表达式,其中E是一个涉及R的属性、常量、算术运算符或者串运符表达式,z是表达式E计算结果的属性的新名字。
-
外连接运算 ⟗ , ⟕ , ⟖ ⟗, ⟕, ⟖ ⟗,⟕,⟖
连接运算的变体,悬浮元组的出现-
外连接的定义
先计算两个关系 R 和 S 的自然连接,
然后再把来自 R 或 S 的悬浮元组加入其中,用null 的表示符号补齐结果元组中那些不具有值的属性。
-
外连接的不同变体
例:
-
5.3 关系逻辑
Datalog 语言
-
Datalog 语言使用if-then规则来表示查询,即可以通过已知的关系中的某些元组的组合来推断查询结果。
-
Datalog 语言包括两种基本的原子,即关系原子和算术原子,由原子按照一定的规则组成 Datalog 查询语句。
-
在 Datalog 语言中,关系通过 “谓词” 来表示,每一个谓词都有固定数量的参数,写为 P ( x 1 , x 2 , … , x n ) P(x_1,x_2,…,x_n) P(x1,x2,…,xn),本质上谓词是一个返回布尔值的函数。
-
假如 R 是包含 n 个属性 a 1 , a 2 , … , a n a_1,a_2,…,a_n a1,a2,…,an 的关系,
那么当元组 ( t 1 , t 2 , … , t n ) (t_1,t_2,…,t_n) (t1,t2,…,tn) 在关系 R 中,则 R ( t 1 , t 2 , … , t n ) R(t_1,t_2,…,t_n) R(t1,t2,…,tn) 为真,否则为假。
-
此外,可以使用变量作为谓词的参数。
例:
A B 1 2 3 4 例如若定义R(x,y),则当 x=1且y=2, 或者x=3且y=4时,R为真,否则为假。
若定义R(1,z),则当z=2时,R为真,否则为假。
-
-
基本结构
-
算术原子
两个算术表达式的比较,值为布尔值。
x < y x < y x<y
x + 1 > y + 5 × z x + 1\gt y + 5\times z x+1>y+5×z
-
扩展谓词和内涵谓词
-
扩展谓词(EDB):
若谓词所指的关系存储在数据库中,称该谓词为扩展谓词(EDB),对应于关系代数表达式中的操作数。
-
内涵谓词(IDB):
当谓词所指的关系是通过一个或多个 Datalog 规则计算得到的,称该谓词是内涵谓词,对应于使用关系代数表达式计算得到的关系。
-
规则
一般规则
-
规则是Datalog语言中描述原子之间关联的规范,包括下列三个组成部分:
- 一个称为头部的关系原子;
- 左向箭头符号←,读作if;
- 主体部分,由一个或多个称为子目标的原子组成。
-
子目标既可以是关系原子,也可以是算术原子。
各个子目标之间用逻辑运算符AND连接,且各个子目标前面可以有NOT取反运算符。
例如: L o n g M o v i e ( t , y ) ← M o v i e s ( t , y , l , g , s , p ) A N D l ≥ 100 LongMovie(t,y)←Movies(t,y,l,g,s,p)\space AND \space l ≥100 LongMovie(t,y)←Movies(t,y,l,g,s,p) AND l≥100 -
规则的目标:使头部关系原子为真。
安全规则
-
由于关系实例总是有限,所以还需要由规则保证得到的头部关系也都是有限的。
-
每个在规则中任意位置出现的变量都必须出现在 主体的某些非否定的关系子目标 中。
-
尤其是任何在规则头部、否定关系子目标、算术子目标中出现的变量,也必须出现在主体的非否定的关系子目标中。
-
例:
违反安全原则的示例: P(x,y)←Q(x,z) AND NOT R(w,x,z) AND x<y
-
5.4 关系代数与Datalog
集合运算 -> Datalog 规则
交集运算
-
可以使用一个Datalog规则来表示
-
由于交集运算涉及了两个关系,那么在Datalog规则中,具有与两个关系对应的子目标;
-
在规则中,相应的参数使用相同的变量。
-
例:
假设R和S的关系模式是R(A,B,C)和S(A,B,C),
则R∩S可以使用规则:
I(a, b, c) ← R(a, b, c) AND 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,非求反子目标是谓词U,求反子目标是谓词V;
- 在该规则中,子目标和头部对于相应的参数都有相同的变量。
-
例:
假设R和S的关系模式是R(A,B,C)和S(A,B,C),
则R-S可以使用规则:
D(x, y, z) ← R(x, y, z) AND NOT S(x, y, z)
投影运算
-
使用一个具有单一子目标的规则,该子目标的参数是不同的变量,每个变量代表关系的一个属性;
-
头部是带有参数的原子,其参数按照期望顺序对应于投影列表的属性。
-
例:
例5.25 将关系Movies (title, year, length, genre, studioName, producerC#)投影到前三个属性:
P(t, y, l) ← Movies(t, y, l, g, s, p)
选择运算
-
如果选择条件是一个或多个算术比较表达式的 AND 运算,可以建立一个具有下列子目标的 Datalog 规则:
- 一个关系子目标,对应于将其进行选择的关系。该关系子目标的每个分量都有不同的变量,且每个分量都对应关系的一个属性;
- 多个算术子目标,每个算术子目标对应选择条件的一个比较运算。在算术子目标中使用相应的变量,并且与关系子目标中建立的变量保持一致。
-
例:
S(t,y,l,g,s,p) ← Movies(t,y,l,g,s,p) AND l≥ 100 AND s=‘Fox’
笛卡尔积
- R×S可以使用单一的Datalog规则来表示
- 规则包含两个子目标分别对应R和S,两个子目标设置不同的变量与属性相对应。
- 头部IDB谓词包含所有子目标中出现的参数,R子目标中的变量列在S的变量前面。
p(a,b,c,x,y,z) ← R(a,b,c) AND S(x,y,z)
连接运算
-
自然连接 ( R ⋈ S {R}\bowtie{S} R⋈S)
-
使用一条近似于笛卡尔积的 Datalog 规则来表示,区别在于 R 和 S 的公共属性列使用相同的变量,否则使用不同的变量。
-
规则头部是一个IDB谓词,它的每个变量出现一次。
-
例:
假设R和S的关系模式是R(A,B)和S(B,C,D),
则自然连接 R ⋈ S {R}\bowtie{S} R⋈S 可以用规则
J(a,b,c,d) ← R(a,b) AND S(b,c,d)
-
-
θ连接
- 先对笛卡尔积进行转化,再对选择条件进行转化。
多重运算
-
模拟多重运算的步骤如下:
-
绘制关系代数的表达式树;
-
表达式树的叶子节点由相应的扩展谓词EDB表示;
-
为表达式树的每一个内部节点建立一个IDB谓词。IDB谓词的一条或多条规则对应树节点上需要使用的算子。
-
与表达式树的根相关联的谓词关系对应于查询结果。
-
例:
-
包 -> Datalog 规则
-
关系代数和 Datalog 规则都可以运用于包运算。
-
将 Datalog 规则应用于包时,其运算步骤如下:
-
第一步,对不同子目标对应的关系进行包连接运算;
-
第二步,按照算术子目标包含的内容,对连接运算的结果进行包选择运算;
-
第三步,把选择结果按照规则头部的关系进行包投影运算。
-
例:
求 π x , z ( R ( x , y ) ⋈ S ( y , z ) ) \pi_{x,z}( R(x,y) \bowtie S(y,z)) πx,z(R(x,y)⋈S(y,z))
H(x,z) ← R(x,y) AND S(y,z)
-
Datalog 规则和关系代数的比较
- 基本关系代数的每一种操作都可以用Datalog查询表达,但扩展关系代数中的分组和聚集等操作无法用规则表达。
- 任何单个Datalog规则都可以用关系代数表达,但Datalog可以表达递归,而关系代数不能。
- 由于IDB谓词也可以在主体中出现,于是规则头部的元组可以反馈到规则主体,从而为头部生成更多的元组。