“差异”操作是否为已经包含“联接”的查询语言增加了表达能力?


19

集差运算符(例如,EXCEPT在某些SQL变体中)是关系代数的许多基本运算符之一。但是,有些数据库不直接支持集合差异运算符,而是支持LEFT JOIN(一种外部联接),实际上,可以使用它代替集合差异运算来达到相同的效果。

这是否意味着即使没有设置差异运算符,只要LEFT JOIN保持该运算符,查询语言的表达能力也是相同的?一个人怎么证明这一事实呢?


1
要表明它们具有相同的表达能力,则表明可以使用左连接操作(以及RA中的其他操作)来构造差异操作。
sxd 2012年

Answers:


14

在关系代数中,我们将首先提供左(外)连接的非正式定义,然后证明它可以通过重命名,选择,连接和投影来构造差异,并且可以使用差异,选择和联合来构造。左(外)联接。实际上,我们最终将以相反的顺序进行操作:我们将展示如何使用差异构造左联接,然后我们将展示如何使用左侧联接构造差异。

RRS分别S具有架构R 'T (R,T)T S '(T,S),其中R 'RS 'S是一个架构中的属性集,而不是另一个架构,TT是公共属性的集。

瓦特= ε ε ε w=(ϵ,ϵ,...,ϵ)是用于模式中的空元组小号'S。也就是说,它是由S 每个属性的所有空值组成的元组S。然后,我们定义左外部联接如下:R LEFT JOIN S是属于模式R 'T S '的所有元组r t s 的集合,其中...(r,t,s)(R,T,S)

  1. r t (r,t) R中的元组R;
  2. (a)t s S的元组或(b)s = w ;(t,s)Ss=w
  3. 如果r t s s w的集合中,则r t w 不在集合中。(r,t,s)sw(r,t,w)

例如:- [R的模式是123小号的模式是234,我们有- [R = { 1 2 3 4 5 6 }小号= { 2 3 4 R(A1,A2,A3)S(A2,A3,A4)R={(1,2,3),(4,5,6)}2 3 6 }。由(1)和(2),我们得到中间结果 { 1 2 3 4 1 2 3 6 1 2 3 ε 4 5 6 ϵ }。由(3),我们必须删除1 2S={(2,3,4),(2,3,6)}{(1,2,3,4),(1,2,3,6),(1,2,3,ϵ),(4,5,6,ϵ)}3 ε ,因为我们具有(例如)1 2 3 4 小号= 4 ε = 瓦特。因此,我们留下了 { 1 2 3 4 1 2 3 6 4 5 6 ε }(1,2,3,ϵ)(1,2,3,4)s=4ϵ=w{(1,2,3,4),(1,2,3,6),(4,5,6,ϵ)},这是左联接的预期结果。

定理:R LEFT JOIN S等同于(R EQUIJOIN S) UNION ((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)

证明:(R EQUIJOIN S)为我们提供了(1)和(2a)所需的一切。我们声称,这((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)给了我们(r, t, w)(2b)和(3)所需形式的一切。

要看到这一点,首先要注意的(((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R)R中所有元组的集合,而S中没有相应的元组。看到这一点,足以注意到,通过从RS(属性集T)中投射出公共属性并取其差值,就剩下了一个,只剩下R中表示的那些元组(具有模式T),但是不š。通过与[R ,我们恢复所有只有在那些元组- [R ,其具有用于在属性值Ť其存在于ř但不是在小号RSRSTTRSEQUIJOINRRTRS; 也就是我们迄今声称的一组元组。

接下来,注意w的模式与R的模式(((PROJECT_T R) DIFFERENCE (PROJECT_T S))相同(即R 'T ),而w的模式为S '。所述因此操作是笛卡尔乘积,我们我们得到的形式的所有元组[R 瓦特在没有š 小号对应于- [R řR(R,T)wSJOIN(r,t,w)(t,s)S(r,t)R

要看到,这恰恰是设置我们需要添加到元组R EQUIJOIN S,以构建R LEFT JOIN S,考虑以下事项:施工,(3)满足,因为R EQUIJOIN S不能包含[R 牛逼S ^ ,如果包含[R 牛逼w (如果这样做,那么第二部分的包含r t w 将是一个矛盾);如果我们要增加另一个[R 牛逼w ^ 不在,然后会出现一个(r,t,s)((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)(r,t,w)(r,t,w)(r,t,w)((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)š 小号对应于- [R [R ,和通过的定义,- [R š 也将是,(3矛盾)。这样就完成了证明。(t,s)S(r,t)REQUIJOIN(r,t,s)R LEFT JOIN S

现在,我们证明左联接可用于构造差异:

定理:R DIFFERENCE S相当于PROJECT_T(SELECT_{t'=w}(R LEFT JOIN (SELECT_{s=s'}(((S JOIN RENAME_{T->T'}(S)))))))

证明:请注意,此处的R 'S '为空,因为共享所有属性才有意义。首先,我们创建从一个新的关系小号通过复制在该属性集小号(由处理和),以便它是由元组'上属性集Ť Ť '其中= '(由处理的)。左连接为我们留下了形式为t t ')的元组RSDIFFERENCESSRENAMEJOIN(t,t)(T,T)t=tSELECT(t,t) where t=tt=t or t=wt=w. Now, to get rid of entries which do also appear in SS, we must keep only the tuples of the form (t,w)(t,w), which is handled by the outermost SELECT. The last PROJECT gets rid of the temporary attribute set TT and leaves us with the difference in terms of the original schema.

例如:设ř = { 1 2 3 4 5 6 }小号= { 3 4 5 6 7 8 }。我们首先得到小号与d属性集Ť '{ 3 4 R={(1,2),(3,4),(5,6)}S={(3,4),(5,6),(7,8)}SRENAMET5 6 7 8 }。该运算为我们提供了具有所有九种可能配对的笛卡尔乘积;出于格式化原因,此处未写此集。所述然后剥这归因于 { 3 4 3 4 5 6 5 6 7 8 7 8 }。在与{(3,4),(5,6),(7,8)}JOINSELECT{(3,4,3,4),(5,6,5,6),(7,8,7,8)}LEFT JOINř给出 { 1 2 ε ε 3 4 3 4 5 6 5 6 }。在给出 { 1 2 ε ε }。在给出 { 1 2 },期望的答案。R{(1,2,ϵ,ϵ),(3,4,3,4),(5,6,5,6)}SELECT{(1,2,ϵ,ϵ)}PROJECT{(1,2)}


Please edit your post to use LaTeX syntax. Start by enclosing all your formula in $ symbols (for example, $(1,2)$ becomes (1,2)(1,2)). Keywords like select should be put in ` (for instance, `SELECT` becomes SELECT).
Raphael

@Raphael Thanks for pointing out that I should be using LaTeX for this. I have made a good-faith attempt at LaTeX'ing the math and backtick'ing the code... please let me know if there's anything else I should do. Thanks again!
Patrick87

Great, thanks! You might want to consider $$...$$ to created indented (not inline) pieces of math. This can often improve readability if used correctly. MathJax also supports numbered equations but I am not sure how to do this.
Raphael

I think your logic is faulty here. You are using DIFFERENCE to define LEFT JOIN, and then you use LEFT JOIN to express DIFFERENCE, concluding that SQL can do without it. For this to be valid, you should express LEFT JOIN in terms of operators other than DIFFERENCE, and then prove that DIFFERENCE is equivalent to it.
Janoma

@Janoma我不认为这是必须的.​​..我们试图证明差异可以用左连接表示,因此假定功能正常。考虑一下:如果您说的是有道理的,我可以说LEFT JOIN是“基本的”或“必要的”操作,并要求您根据其他运算符而不是LEFT JOIN定义DIFFERENCE。我已经证明了彼此可以模拟彼此,所以两者都不比彼此“基本” ...是什么使DIFFERENCE与众不同?在道具中。逻辑上,“与”和“与”以及“与”和“与非”都是完整的;您不需要全部三个。
Patrick87 2012年

-1

LEFT JOIN as implemented by SQL, does not produce relations as its result (because some attributes of the result will not have a value).

Ergo, LEFT JOIN as implemented by SQL, is not a direct counterpart of any relational algebra operator.

Ergo, The relational difference operator cannot be expressed in terms of LEFT JOIN (because LEFT JOIN cannot possibly be part of the relational algebra, this being because LEFT JOIN produces something that is not a relation, thus violating closure of the algebra).

Any set of primitive operators of a relational algebra that satisfies closure that I know of, always includes either relational difference or else relational semidifference.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.