Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 关系代数聚合函数_Database_Relational Algebra - Fatal编程技术网

Database 关系代数聚合函数

Database 关系代数聚合函数,database,relational-algebra,Database,Relational Algebra,我有以下员工模式: 员工(身份证、姓名、地址、年龄) 为了找出最老员工的姓名,我知道SQL,它看起来像: select name from employee, (select max(age) max_age from employee) e2 where age=max_age 但我不确定在关系代数中如何做到这一点。教科书再次没有提到如何做这些事情 我的可能解决方案如下所示: π姓名(σ年龄=最大年龄(员工×) ρmax_年龄/年龄(ℱmax(年龄)(员工))您的“可能解决方案”没有错,但

我有以下员工模式:

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

为了找出最老员工的姓名,我知道SQL,它看起来像:

select name from employee,
(select max(age) max_age from employee) e2
where age=max_age 
但我不确定在关系代数中如何做到这一点。教科书再次没有提到如何做这些事情

我的可能解决方案如下所示:

π姓名(σ年龄=最大年龄(员工×) ρmax_年龄/年龄(ℱmax(年龄)(员工))

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

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

π姓名(员工)⋈ (ℱ最高年龄(雇员)

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

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

2) 它们没有非常全面地涵盖聚合函数

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

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

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


顺便说一句,您可以完全避免最大聚合,只需再多做一点工作,请参见您的解决方案应该可以工作。一般方法与您所做的相同:使用一个或多个应用于同一个表的聚合运算符跨表。请注意,如果您希望在帖子中使用标准RA表示法,您可以使用“”和HTML字符实体(例如,输入“ρ”获取ρ,×;”for×,“&x22C8;”for⋈).@奥蒂斯:谢谢你的建议。如果我们使用html代码添加实际符号,看起来会更好。