所有的SQL查询都可以用关系代数、域和元组关系演算来表示吗?



我的查询包含一个having和count或all in。这些在RA/DRC/TRC中是如何表示的?我是否需要进一步简化我的SQL查询?下面是一个简单的例子:

empl(employee (primary key), city)
managers(employee (primary key), manager (foreign key of employee))

如果我要找到X市所有员工的所有经理(来自任何城市)…我需要用having/count。不确定在RA/DRC/TRC中如何做到这一点。

我知道需要这样一个查询可能没有意义,但假设它对于这个问题的目的是合理的。

谢谢

您的查询有点模棱两可。它的目的确实是找到所有的经理谁是在X城市的每一个员工的经理?

如portas所示,这在RA中是完全可行的。

方法如下:

获取x市所有员工的集合,称之为EMPX。

获取所有管理器的集合。叫它MGRS

求两者的笛卡尔积。叫它MGRS_EMPX

从中减去表的实际值(适当地向下投影到所需的属性),该值表示哪个经理管理哪个员工。这个差包含了所有真实存在的经理的组合,其中一个员工位于X,但该经理不管理该员工。

将差异投射到manager属性上。该关系告诉您存在哪些经理,使得X市存在某个员工不是由该经理管理的

从MGRS中减去这个关系。显然,这个关系告诉你存在哪些经理,使得X城市不存在不受该经理管理的员工。

重写这个否定的存在量词作为通用量化将显示,这正是你想要的结果:不存在X和电磁脉冲(EMP:电磁脉冲是由经理)= = =给EMP:不是X和电磁脉冲(EMP是由经理)= = =给EMP: (EMP不在X或EMP由经理)= = =给EMP: X(如果EMP然后EMP由经理)。

这些都是很好的代数运算

(附带练习:看看如果X市没有员工会发生什么)

关系划分是您的特定示例的答案—您不需要聚合。除法是代数的一部分。

您更一般的问题是一个复杂的问题,因为确定任何可能的SQL结果何时与关系结果相同的问题。返回重复行的SQL查询是否等同于不返回重复行的关系表达式?SQL查询与SQL样式的空等价于任何关系表达式?如何仅使用SQL语法表示没有属性的关系投影?

我认为唯一合理的回答是说SQL模型和关系模型是两个完全不同和不兼容的东西。你可能不应该太费劲地寻找它们之间的对应关系。

聚合查询在RA中不可表示。

也许你把问题简单化了。但是为X市的员工找经理很简单——没有Count和Having。

编辑:

select  * 
from managers m,
( select employee from empl where city = 'XXXXX' ) e
where m.employee = e.employee

最新更新