6

是的,这是一道作业题,但为了保护无辜者,名称已更改。意思是,我不是在问作业问题本身,而是问其中的一小部分,以便我能理解整体。

假设您有一个这样的 SQL 查询:

--查询将列出不止一次出现的汽车价格。

select car_price from cars
group by car_price
having count (car_price) > 1;

关系代数中 this 的一般形式是 Y (gl, al) R 其中 Y 是希腊符号,GL 是要分组的属性列表,AL 是聚合列表

所以关系代数看起来像:

 Y (count(car_price)) cars

那么,该语句中的“有”子句是如何写的呢?有简写吗?如果没有,我是否只需要从该关系中进行选择?可能是这样的?

SELECT (count(car_price) > 1) [Y (count(car_price)) cars]

我已经在互联网上搜索了几个小时,但没有找到将 HAVING 转换为关系代数的示例。谢谢您的帮助!

4

2 回答 2

3

select count(*) from (select * from cars where price > 1) as cars;

也称为关系闭包。

于 2010-01-16T01:04:48.420 回答
0

对于所提出的实际问题“关系代数 - 表示“有”子句的正确方法是什么?存在诸如“THE”关系代数之类的东西,但这种假设根本不正确!

代数是一组运算符,任何人都可以定义他喜欢的任何一组运算符,这意味着任何人都可以定义他喜欢的任何代数!在他最近的出版物中,Hugh Darwen 提到 RESTRICT 不是代数的基本运算符,尽管许多其他人确实认为它是这样的。

尤其是在聚合和总结方面,关于如何将它们合并到关系代数中几乎没有共识。将诸如 COUNT() 之类的运算符(将关系作为参数值并返回一个整数)定义为代数的一部分,对于代数的闭包属性可能会有问题,正是因为这样的运算符不返回关系......

因此,抱歉,但最合适的答案似乎是,几乎不可能给出对这个问题的结论性答案......

于 2010-03-14T22:26:19.380 回答