给定关系a(a,b,c),b(e,f),c(d,g,h),其中a有800个元组,b200和c500。在最坏的情况下给出表达式abc(带*自然连接):
a) 800 tuples
b) 200 tuples
c) 500 tuples
d) 800*200*500 tuples
e) 800+200+500 tuples
f) Nothing from the above.
我猜是800+200+500,因为没有任何共同的属性?如果有一个共同的属性呢?
给定关系a(a,b,c),b(e,f),c(d,g,h),其中a有800个元组,b200和c500。在最坏的情况下给出表达式abc(带*自然连接):
a) 800 tuples
b) 200 tuples
c) 500 tuples
d) 800*200*500 tuples
e) 800+200+500 tuples
f) Nothing from the above.
我猜是800+200+500,因为没有任何共同的属性?如果有一个共同的属性呢?
2条答案
按热度按时间tct7dpnv1#
没有共同行的表上的自然连接实际上是交叉连接,正如您正确地假设的那样。你会得到abc=800200500=80000000行。
一旦这些表有公共列,就会进行筛选。根据是否有匹配项以及有多少匹配项,可以得到0到80000000行之间的任何值。示例:
如果所有表都有一个共同的列,并且每个表中的每一行的值都相同,那么您将再次得到所有的组合。
如果所有表都有一个公共列,并且其值在表a的所有行中为“a”,在表“b”的所有行中为“b”,在表c的所有行中为“c”,则最终没有匹配项,即零行。
毕竟,这一切都是枯燥的理论,因为在他们正常的头脑中没有人会使用自然连接:-)
exdqitrt2#
我想你是说
cross join
而不是natural join
,因为您说过这三个表没有共同的列。在这种情况下,您将得到三个表的笛卡尔积,即表中所有行的可能组合:这将在结果集中得到800200500行。
另一方面,如果表之间存在1-1关系(即,在其他表中可以找到每个表中的0或1行),并且您将这些表与
inner join
s、 然后您将得到三个表中确实存在的行的子集:最多200行(如果三个表中没有匹配的元组,则可能是0行)。然而,这并不是你的问题所指的。如果您处理的是其他类型的关系(一对多,多对多,…),那么就没有通用的答案。它确实取决于关系和数据。