在本文中,让我们讨论 GATE 中常见的关系代数问题类型。在阅读本文之前,您应该对关系代数中的基本运算符和扩展运算符有所了解。
类型 1:给定一个关系代数表达式,找出结果。
假设您有一个关系 Order(Prod_Id, Agent_Id, Order_Month) 并且您必须找出以下代数表达式将返回什么。
∏Order1.Prod_Id (ρ(Order1,Order) Order1.Prod_Id=Order2.Prod_Id
and Order1.Agent_Id≠Order2.Agent_Id
and Order1.Order_Month=Order2.Order_Month ρ(Order2,Order))
从最里面的括号开始处理表达式。
在这个例子中,我们将订单重命名为 Order1 和 Order2(两者都代表相同的关系订单)。然后我们在 Order1 和 Order2 之间应用了条件连接。它将返回那些 Order1 和 Order2 的 Product_Id 和 Order_Month 相同但 Order1 和 Order2 的 Agent_Id 不同的行。它意味着同一产品在同一个月内由两个不同的代理订购的行。然后我们正在投影 Prod_Id。
所以最终的输出将返回不同代理商在同一月订购的产品的 Prod_Id。我们可以通过获取样本数据来做到这一点。 Let Order 关系由以下数据组成。
表 –订单
Prod_Id | Agent_Id | Order_Month |
---|---|---|
P001 | A001 | JAN |
P002 | A002 | FEB |
P002 | A001 | FEB |
P001 | A002 | FEB |
当我们应用以下表达式时,将选择以蓝色突出显示的行。
(ρ(Order1,Order)Order1.Prod_Id=Order2.Prod_Id
and Order1.Agent_Id≠Order2.Agent_Id
and Order1.Order_Month=Order2.Order_Month ρ(Order2,Order))
Order1.Prod_Id | Order1.Agent_Id | Order1.Order_Month | Order2.Prod_Id | Order2.Agent_Id | Order2.Order_Month |
---|---|---|---|---|---|
P001 | A001 | JAN | P001 | A001 | JAN |
P002 | A002 | FEB | P001 | A001 | JAN |
P002 | A001 | FEB | P001 | A001 | JAN |
P001 | A002 | FEB | P001 | A001 | JAN |
P001 | A001 | JAN | P002 | A002 | FEB |
P002 | A002 | FEB | P002 | A002 | FEB |
P002 | A001 | FEB | P002 | A002 | FEB |
P001 | A002 | FEB | P002 | A002 | FEB |
P001 | A001 | JAN | P002 | A001 | FEB |
P002 | A002 | FEB | P002 | A001 | FEB |
P002 | A001 | FEB | P002 | A001 | FEB |
P001 | A002 | FEB | P002 | A001 | FEB |
P001 | A001 | JAN | P001 | A002 | FEB |
P002 | A002 | FEB | P001 | A002 | FEB |
P002 | A001 | FEB | P001 | A002 | FEB |
P001 | A002 | FEB | P001 | A002 | FEB |
投影 Order1.Prod_Id 后,输出将是P002 ,即同一月至少有两个不同代理商订购的产品的 Prod_Id。
注意 –如果我们想找到至少三个不同代理在同一月订购的 Prod_Id,可以这样做:
∏Order1.Prod_Id (σOrder1.Prod_Id=Order2.Prod_Id
and Order1.Prod_Id=Order3.Prod_Id
and Order1.Agent_Id≠Order2.Agent_Id
and Order1.Agent_Id≠Order3.Agent_Id
and Order2.Agent_Id≠Order3.Agent_Id
and Order1.Order_Month=Order2.Order_Month
and Order1.Order_Month=Order3.Order_Month(ρ(Order1,Order)X ρ(Order2,Order)X ρ(Order3,Order)))
类型 2:给定两个关系,自然连接后元组的最大和最小数量是多少?
考虑以下带有下划线主键的关系 R(A, B ,C) 和 S( B,D,E)。关系 R 包含 200 个元组,关系 S 包含 100 个元组。自然 Join R 和 S 中可能的最大元组数是多少?
要解决此类问题,首先,我们将看到将在哪个属性上进行自然连接。自然连接选择那些具有相同属性值的行。在这种情况下,表达式将类似于:
σR.B=S.B (RX S)
在关系 R 中,属性 B 是主键。因此关系 R 将有 200 个不同的 B 值。另一方面,关系 S 将 BD 作为主键。所以属性 B 可以有 100 个不同的值或所有行的 1 个值。
案例 1: SB 有 100 个不同的值,并且这些值中的每一个都与 RB 匹配
在这种情况下,S 中 B 的每个值都将与 R 中的 B 值匹配。因此自然连接将有 100 个元组。
案例 2: SB 有 1 个值并且该值与 RB 匹配
在这种情况下,S 中 B 的每个值都将与 R 中的 B 值匹配。因此自然连接将有 100 个元组。
案例 3: SB 有 100 个不同的值,但这些值都与 RB 不匹配
在这种情况下,S 中 B 的任何值都不会与 R 中的 B 值匹配。因此自然连接将具有 0 元组。
案例 4: SB 有 1 个值,与 RB 不匹配
在这种情况下,S 中 B 的任何值都不会与 R 中的 B 值匹配。因此自然连接将有 0 个元组。
因此,元组的最大数量将为 100,而 min 将为 0。
注意 –如果明确提到 SB 是 RB 的外键,那么上面讨论的 Case-3 和 Case-4 是不可能的,因为 SB 的值将来自 RB 所以,最小和最大元组数在自然连接中将是 100。
参考资料 – Navathe 数据库系统基础