【发布时间】:2018-07-19 10:12:54
【问题描述】:
(注意:不是this question 的重复项,因为该问题有一个特定的查询。这更多是从一般的理论角度来看。)
我在大学学习数据库,了解到SQL数据库,为了执行一个查询,首先将它翻译成relational algebra,以便形成如何执行它的计划。关系代数可以很容易地表示不相关的 SQL 子查询,如果需要,我们可以将它们组合成连接或集合操作。例如,我们可以很容易地表达
SELECT y FROM Table WHERE y NOT IN (SELECT x FROM AnotherTable);
作为两个查询之间的一组差异。
但是,据我所知,关系代数没有提供任何机制来表达 SQL 的相关子查询概念,或者从父查询中捕获列的查询,因此必须多次执行,例如下面的示例:
SELECT employee_number, name
FROM employees AS emp
WHERE salary > (
SELECT AVG(salary)
FROM employees
WHERE department = emp.department);
(在此示例中,外部WHERE 子句中的子查询与员工的部门相关,这意味着必须为每个员工运行一次子查询才能按部门过滤结果。)
与许多其他相关子查询一样,可以通过使用连接和单个聚合查询来取消此子查询的相关性,这将允许查询在 RA 中完美表达,并且还导致子查询只运行一次:
SELECT emp.employee_number, emp.name
FROM employees AS emp
JOIN (
SELECT department AS department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department) AS salaries
ON emp.department = salaries.department
WHERE emp.salary > salaries.avg_salary;
然而,是否有可能将 所有 相关子查询表示为去相关子查询,以便将它们表示为关系代数,或者是否有一些相关子查询必须这样表示?换句话说,SQL 关联仅仅是一种便利特性,不会增加任何 SQL 的表达能力,还是 RA 仅仅是一种实现指南,因为这个特性,SQL 的表达能力更强?
如果是前者,这个证明/算法是什么?如果是后者,是否存在一种普遍接受的直接表示相关性的 RA 形式?
【问题讨论】:
标签: sql theory relational-algebra