DBMS - 除法运算
在关系代数中,有几个运算符由于其独特的功能而至关重要。其中一个运算符是除法运算符,用符号“÷”表示。这个运算符相对复杂,但在解决涉及“所有”条件的查询中起着关键作用。虽然许多关系代数操作专注于组合或过滤数据,但除法运算用于识别一个关系中与另一个关系中的每个元组相关联的元组。
在本章中,我们将详细探讨除法运算符的概念,理解其理论基础,并通过实际示例来掌握其应用。
除法运算符基础
除法运算适用于两个关系 —
- 分子关系 (R) — 表示主要数据集,包含可能组合的超集。
- 分母关系 (S) — 表示必须满足的子集或条件集。
结果是一个关系,仅包含分子中与分母中每个元组相关联的那些元组。
关系中的属性
让我们定义除法运算符涉及的属性 —
- R(Z) 是分子,其中 Z = X ∪ Y
- S(X) 是分母
- T(Y) 是结果
这里,T 包含R中不在S中的属性。要出现在T中,一个元组必须在R中与S中的每个元组配对。
为了更好地理解这个概念,请考虑一个现实场景。假设我们正在组织一个研讨会。参与者(R)与会话(X)相关联。我们想找出那些参加所有必修会话(S)的参与者。除法运算符通过评估“参加所有会话”条件来帮助识别这些人。
除法运算符的逐步解释
除法运算确保T(Y)中的每个结果元组必须与S(X)中的每个元组在R(Z)中组合出现。R中无法与S中所有元组匹配的任何元组都会从结果中排除。
数学表示
除法运算符可以使用投影、笛卡尔积和差的组合来表达 —
- T1 — 识别所有潜在结果元组:T1 ← πY(R)
- T2 — 找出 T1 中不满足与S配对条件的元组:T2 ← πY((S × T1) − R)
- 最终结果 — 从潜在结果中减去不满足条件的元组。T ← T1 − T2
示例:参与所有项目的员工
让我们通过一个示例来清楚理解 division operator(除法运算符)的工作原理。
查询 − 找出参与 "John Smith" 所参与的所有项目的员工姓名。
涉及的关系 − 以下是该查询涉及的关系 –
WORKS_ON − 包含员工 ID (Essn) 和项目编号 (Pno) 的元组。
| Essn | Pno | Hours |
|---|---|---|
| 123456789 | 1 | 32.5 |
| 123456789 | 2 | 7.5 |
| 666884444 | 3 | 40.0 |
| 453453453 | 1 | 20.0 |
| 453453453 | 2 | 20.0 |
| 333445555 | 2 | 10.0 |
| 333445555 | 3 | 10.0 |
| 333445555 | 10 | 10.0 |
| 333445555 | 20 | 10.0 |
| 999887777 | 30 | 30.0 |
| 999887777 | 10 | 10.0 |
| 987987987 | 10 | 35.0 |
| 987987987 | 30 | 5.0 |
| 987654321 | 30 | 20.0 |
| 987654321 | 20 | 15.0 |
| 888665555 | 20 | NULL |
EMPLOYEE − 包含个人信息,如 Fname、Lname 和 Ssn。
| Fname | Minit | Lname | Ssn | Bdate | Address | Sex | Salary | Super_ssn | Dno |
|---|---|---|---|---|---|---|---|---|---|
| John | B | Smith | 123456789 | 1965-01-09 | 731 Fondren, Houston, TX | M | 30000 | 333445555 | 5 |
| Franklin | T | Wong | 333445555 | 1955-12-08 | 638 Voss, Houston, TX | M | 40000 | 888665555 | 5 |
| Alicia | J | Zelaya | 999887777 | 1968-01-19 | 3321 Castle, Spring, TX | F | 25000 | 987654321 | 4 |
| Jennifer | S | Wallace | 987654321 | 1941-06-20 | 291 Berry, Bellaire, TX | F | 43000 | 888665555 | 4 |
| Ramesh | K | Narayan | 666884444 | 1962-09-15 | 975 Fire Oak, Humble, TX | M | 38000 | 333445555 | 5 |
| Joyce | A | English | 453453453 | 1972-07-31 | 5631 Rice, Houston, TX | F | 25000 | 333445555 | 5 |
| Ahmad | V | Jabbar | 987987987 | 1969-03-29 | 980 Dallas, Houston, TX | M | 25000 | 987654321 | 4 |
| James | E | Borg | 888665555 | 1937-11-10 | 450 Stone, Houston, TX | M | 55000 | NULL | 1 |
现在,让我们逐步理解如何找出参与 "John Smith" 所参与的所有项目的员工姓名。
检索 John Smith 的项目
首先筛选出与 "John Smith" 关联的项目。
$$\mathrm{SMITH \: ← \: σ_{Fname \:=\: 'John'\: AND\: Lname\:=\:'Smith'}\: (EMPLOYEE)}$$
| Fname | Minit | Lname | Ssn | Bdate | Address | Sex | Salary | Super_ssn | Dno |
|---|---|---|---|---|---|---|---|---|---|
| John | B | Smith | 123456789 | 1965-01-09 | 731 Fondren, Houston, TX | M | 30000 | 333445555 | 5 |
$$\mathrm{SMITH_PNOS \:←\: π_{Pno}\:(WORKS_ON\: \bowtie_{Essn \:=\: Ssn} SMITH)}$$
| Pno |
|---|
| 1 |
| 2 |
这将得到一个关系 SMITH_PNOS,其中包含 "John Smith" 被分配的所有项目编号。
创建所有员工-项目关系
提取一个显示所有员工及其关联项目的关系。
$$\mathrm{SSN_PNOS\: ←\: π_{Essn,\: Pno}\:(WORKS_ON)}$$
| Essn | Pno |
|---|---|
| 123456789 | 1 |
| 123456789 | 2 |
| 666884444 | 3 |
| 453453453 | 1 |
| 453453453 | 2 |
| 333445555 | 2 |
| 333445555 | 3 |
| 333445555 | 10 |
| 333445555 | 20 |
| 999887777 | 30 |
| 999887777 | 10 |
| 987987987 | 10 |
| 987987987 | 30 |
| 987654321 | 30 |
| 987654321 | 20 |
| 888665555 | 20 |
应用除法运算
使用 division operator(除法运算符)找出其项目分配覆盖 SMITH_PNOS 中所有项目的员工。
$$\mathrm{SSNS(Ssn)\: ←\: SSN_PNOS\: ÷\: SMITH_PNOS}$$
| Ssn |
|---|
| 123456789 |
| 453453453 |
将员工 ID 映射到姓名
最后,检索这些员工的姓名。
$$\mathrm{RESULT\: ←\: π_{Fname,\: Lname}(SSNS\: \bowtie \: EMPLOYEE)}$$
| Fname | Lname |
|---|---|
| John | Smith |
| Joyce | English |
最终输出 − 最终关系包含参与 "John Smith" 所参与的所有项目的员工姓名。
广义示例:产品和供应商
场景 − 一家商店销售由各种供应商(S)供应的产品(R)。我们希望识别所有供应商均可提供的产品。
输入关系
- R − 包含 ProductID 和 SupplierID
- S − 仅包含 SupplierID
让我们逐步分析其步骤。
提取潜在产品 −
$$\mathrm{T1 \:←\: π_{ProductID}\: (R)}$$
识别不匹配的产品 −
$$\mathrm{T2 \:←\: π_{ProductID}\: ((S\: ×\: T1)\: −\: R)}$$
从潜在产品中减去不匹配项 −
$$\mathrm{T \:←\: T1 \:−\: T2}$$
输出 − 如果只有某些产品由每个供应商提供,则这些产品 ID 将出现在结果关系 T 中。
关键观察
- 处理全称量化 − 除法运算符适用于需要“对所有”条件的查询。这类似于查找注册了所有必修课程的学生,或分配到列表中每个项目的员工。
- SQL 中的限制 − SQL 不直接支持除法运算符。然而,可以使用 NOT EXISTS 或复杂连接来实现类似结果。尽管这些方法可能缺乏关系代数的强大表达能力。
- 实际相关性 − 虽然在理论上具有重要意义,但由于其复杂性和罕见的使用场景,除法运算符在实际数据库管理系统中较少使用。
其他应用
- 匹配偏好 − 查找其偏好匹配产品每个特征的客户。
- 跨部门参与 − 识别参与所有部门活动的员工。
结论
在本章中,我们探讨了关系代数中的除法运算符——一个处理带有“所有”条件的查询的强大工具。我们讨论了其理论基础、数学公式,并通过员工项目和产品供应商关系的详细示例进行了说明。我们还回顾了其在 SQL 中的限制,并指出了其在数据库查询中的专业作用。