【问题标题】:Relational algebra aggregate function关系代数聚合函数
【发布时间】:2014-05-26 01:12:26
【问题描述】:

我有以下员工架构:

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

要找出最年长员工的姓名,我知道 SQL 如下所示:

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

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

我可能的解决方案如下:

π姓名age=max_age(员工× ρmax_age/age(ℱmax(age)(employee)) ))

【问题讨论】:

  • 您的解决方案应该有效。通用方法与您所做的一样:将一个或多个聚合运算符应用于同一个表来交叉表。
  • 请注意,如果您想在帖子中使用标准 RA 表示法,您可以使用“”和 HTML 字符实体(例如,输入“ρ”以获得 ρ、“× " 代表 ×,"⋈" 代表⋈)。
  • @outis:谢谢你的建议。如果我们使用 html 代码添加实际的符号看起来会更好。

标签: database relational-algebra


【解决方案1】:

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

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

πname (员工⋈(ℱmax(age)(employee)))

我并不奇怪你在教科书中找不到这个:

1) 他们没有教授自然连接的全部力量。

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

这是因为与 RA (IMO) 相比,SQL 的弱点:

1) 自然连接是 SQL 中相对较新的一项创新(没有得到很好的支持)。

2) SQL 的聚合实现非常糟糕。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 2021-04-07
    • 2017-02-01
    相关资源
    最近更新 更多