可以在关系代数,域和元组关系演算中表示所有SQL查询

时间:2011-10-11 20:08:18

标签: sql database relational-database relational-algebra relational-division

我的查询包括有和计数或全部进入。如何在RA / DRC / TRC中表示?我还需要更简化SQL查询吗?这是一个简化的例子:

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

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

我知道这种查询的必要性可能没有意义但是假设这个问题的目的是明智的。

由于

4 个答案:

答案 0 :(得分:4)

你的查询有点含糊不清。确实有意找到所有经理,他们都是X市的每位员工的经理?

正如dportas指出的那样,这在RA中是完全可行的。

以下是:

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

获取所有经理的集合。称之为MGRS。

制作两者的笛卡尔积。称之为MGRS_EMPX。

从中减去表的实际值(适当地预测到所需的属性),说明哪些经理管理哪个员工。这种差异包含了所有真正存在的经理组合,其中一名员工位于X中,但该经理不管理该员工。

将差异投射到manager属性上。该关系告诉您哪些经理存在,以便城市X中存在一些由该经理 NOT 管理的员工。

从MGRS中减去这种关系。显然,这种关系告诉你哪些管理者存在,以至于不存在位于城市X的员工,该员工不是由该管理者管理的。

将这种对存在量词的否定重写为通用量化将揭示这正是您想要的结果:不存在(EMP:EMP在X和EMP管理的EMP中)=== FOR FOR EMP:NOT(EMP)在MGR管理的X和EMP中)=== FORALL EMP :( EMP不在X或EMP中由MGR管理)=== FORALL EMP :(如果EMP在X中,则EMP由MGR管理)。

所有这些都是非常精细的代数运算。

(小组练习:如果根本没有员工位于X市,会发生什么。)

答案 1 :(得分:3)

关系部门是您具体示例的答案 - 您不需要聚合。分部是代数的一部分。

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

我认为唯一明智的答案是说SQL模型和关系模型是两个完全不同且不兼容的东西。你可能不应该对他们之间的通信看起来太难了。

答案 2 :(得分:1)

答案 3 :(得分:-1)

也许你过分简化了你的问题..但是在X市找到员工的经理是一个简单的联系 - 没有计数或有。

编辑:

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