XBi*_*13X 25 sql aggregate relational-algebra max aggregate-functions
我目前正在做一项家庭作业,要求进行选择,以拉出包含与所有其他记录相比最大值的特定属性的元素.我在线阅读了一些引用称为"最大"的"聚合"关系代数函数,但它们没有描述它如何使用基本运算符.如何选择包含最大值的属性?
SáT*_*SáT 39
您只需使用基本运算符即可很好地表达聚合函数.这是一个非常巧妙的事情.
假设我们有一个表T,我们想找到它的"值"字段的最大值.首先,我们应该将T的笛卡尔积与自身 - 或者更确切地说是自身的副本T2.然后我们选择T.value小于T2.value的行:这会让我们知道所有不需要的行,其值小于其他行的值.要获得最大值,我们应该从所有行的集合中减去这些不需要的行.就是这样.至少这是基本思想,我们还需要使用投影来确定尺寸.
不幸的是我不知道如何在这里插入Latex,但使用关系代数符号,它是这样的:
?(T.a1...Tan, T.value)(T)
-
?(T.a1...Tan, T.value)(
?(T.value<T2.value)( ?(T, T2) x T )
)
Run Code Online (Sandbox Code Playgroud)
其中π是投影算子, - 是设定差值,σ是选择算子,ρ是重命名算子.
SQLishly:
SELECT T.* FROM T
MINUS
SELECT T.* FROM T, T as T2 WHERE T.value<T2.value
Run Code Online (Sandbox Code Playgroud)
更实际的是:
SELECT T.* FROM T LEFT JOIN T as T2 ON T.value<T2.value WHERE T2.value IS NULL
Run Code Online (Sandbox Code Playgroud)
当然,所有这些主要只是学术兴趣,即它表明关系代数有效.