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

2 sql database relational-algebra relational-database relational-division

我的查询包括拥有和计数或全部。这些在 RA/DRC/TRC 中如何表示?我是否必须进一步简化我的 SQL 查询?这是一个简化的示例:

empl(employee (primary key), city)
managers(employee (primary key), manager (foreign key of employee))
Run Code Online (Sandbox Code Playgroud)

如果我要找到 X 市所有员工的经理(来自任何城市)的所有员工..我需要使用having/count。不知道在 RA/DRC/TRC 中这将如何完成。

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

谢谢

Erw*_*out 5

您的查询表述得有点含糊。确实是为了找到所有经理,他们是 X 市每个员工的经理?

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

就是这样 :

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

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

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

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

将这种差异投射到经理属性上。该关系告诉您存在哪些经理,使得 X 城市存在不受经理管理的员工。

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

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

所有这些都是完美的代数运算。

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