关系代数聚合函数

时间:2014-05-26 01:12:26

标签: database relational-algebra

我有以下员工架构:

员工(身份证,姓名,地址,年龄)

要查找最老员工的姓名,我知道SQL的外观如下:

select name from employee,
(select max(age) max_age from employee) e2
where age=max_age 

但我不确定如何在关系代数中做到这一点。教科书再一次没有提到如何做这些事情。

我的可能解决方案如下:

π name (σ age = max_age (员工× ρ max_age / age (ℱ max(年龄)(员工))))

1 个答案:

答案 0 :(得分:0)

你的“可能的解决方案”没有错,但太复杂了。

请注意,过滤器(σ age = max_age )是对相等性的测试,max_age是年龄的重命名。您可以通过添加nat连接而不是交叉产品来避免重命名和sigma:

πname(员工⋈(ℱmax(年龄)(员工)))

我不会惊讶你在教科书中找不到这个:

1)他们没有教导自然联合的全部力量。

2)它们不能非常彻底地涵盖聚合函数。

这是因为SQL与RA(IMO)相比存在弱点:

1)自然连接是SQL中相对较新的创新(不太受支持)。

2)SQL的聚合实现是可怕的。

顺便说一句,你可以完全避免使用最大聚合,但需要更多工作,请参阅finding max value among two table without using max function in relational algebra