我有以下员工架构:
员工(身份证,姓名,地址,年龄)
要查找最老员工的姓名,我知道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(年龄)(员工))))
答案 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