【问题标题】:Relational algebra - what is the proper way to represent a 'having' clause?关系代数 - 表示“有”子句的正确方法是什么?
【发布时间】:2010-01-15 03:23:55
【问题描述】:

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

假设你有一个这样的 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 转换为关系代数的示例。感谢您的帮助!

【问题讨论】:

  • +1 诚实对待家庭作业。
  • 嘿,我认为标题中带有“关系代数”的任何内容都是默认作业。
  • 我对关系代数一无所知,但是“拥有”与“在哪里”是一样的,只是它可以应用于集合的聚合。关系代数有什么不同的原因吗?

标签: relational-algebra


【解决方案1】:

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

也称为关系闭包。

【讨论】:

    【解决方案2】:

    对于所提出的实际问题“关系代数 - 表示‘有’子句的正确方法是什么?”,要获得或多或少准确的答案,首先需要说明问题本身似乎暗示了这一点,或者假设存在“THE”关系代数这样的东西,但这种假设根本不正确!

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-01-06
      • 2016-11-01
      • 2022-05-23
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 2016-09-11
      • 2016-08-16
      • 1970-01-01
      相关资源
      最近更新 更多