Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL中的自然连接_Sql - Fatal编程技术网

SQL中的自然连接

SQL中的自然连接,sql,Sql,表: 编写一个SQL查询,返回在海战中受损、后来参加另一种战斗的船只的名称 答复: Ships (shipName, shipType, launchDate) Battles (battleName, battleDate) Outcomes (shipName, battleName, result) 你能解释为什么这个答案有效吗 当我们进行自然连接时,我们使用相同的名称连接属性 战斗b1自然连接结果o1在这一个中,两者唯一共同的属性是战斗名称 但在战斗中,b1自然会加入o1 selec

表:

编写一个SQL查询,返回在海战中受损、后来参加另一种战斗的船只的名称

答复:

Ships (shipName, shipType, launchDate)
Battles (battleName, battleDate)
Outcomes (shipName, battleName, result)
你能解释为什么这个答案有效吗

当我们进行自然连接时,我们使用相同的名称连接属性

战斗b1自然连接结果o1在这一个中,两者唯一共同的属性是战斗名称

但在战斗中,b1自然会加入o1

 select 
     o1.shipName
 from 
     (Battles b1 natural join Outcomes o1)
 natural join
    (Battles b2 natural join Outcomes o2)
 where 
    o1.result = ’damaged’
    and b2.battleDate > b1.battleDate;

所有属性都很常见,自然连接现在是如何工作的?

当您有同名列时,自然连接可以工作。你可以使用自然连接和连接..使用-是一样的。在您的示例中,列名称非常适合于此

自然联接由考虑到其公共列名的联接表组成。 政府的解释如下:

两个表的自然[左]连接在语义上定义为 相当于内部联接或带有USING子句的左联接 命名两个表中存在的所有列

查询是有效的,因为在BattleB1和o1之间使用一个自然连接,有一个公共列battleName,否则,如果没有任何公共列,您将不会得到任何有用的结果—一个意外的结果。 看看这个

但在战斗中b1自然连接结果o1自然连接战斗b2 自然连接结果:所有属性都是常见的如何 你现在工作吗


自然连接的工作原理与第一个自然连接完全相同,它考虑公共列。该查询将两个表的结果一起显示一次以上,以考虑不同行的不同战斗日期。

在回答中有三个自然联接,但是使用三个连接的自然加入BETETEN战斗和结果。部分共同点是相同的:战斗和结果之间的自然连接仅具有共同的战斗名称。此战斗b1自然连接结果o1自然连接结果b2自然连接结果o2具有共同的一切。在最后一个战斗中,当所有属性都具有相同的名称时,自然连接将仅为我们提供在这两个属性中具有相同值的元组桌子。如果我们在战斗b1自然连接结果o1中有两个元组war1,ship1,damage,2001和war1,ship1,damage,2003,并且在其他自然连接结果o1中有相同的元组,那么最终结果将是war1,ship1,damage,2001和war1,ship1,damage,2003我们不会得到war1,ship1,damage,20012003或war1,ship1,damage,20012001或war1,ship1,damage,2003,2001@user2975699对如果列不匹配,您将获得所有没有任何联接的行,并且将显示两个表的所有列,因为没有匹配。你看了我贴的小提琴了吗?我们不会得到像战争1,战舰1,损坏,20032001这样的元组是的,我看到了。我们的表只有BATTLENAME BATTLEDATE SHIPNAME结果作为属性。然后我们如何检查b2.BattleDate和b1.BattleDate这两个属性甚至不在通过自然联接创建的表中。@user2975699确实不是。即使没有其他列带有日期,也不会得到这样的行,除了结果表的BattleDate列。您试过了吗?它真的像预期的那样工作吗?我理解你的担忧,但正如@ypercube所提到的,你是尝试过它还是预期结果理论?我也对此表示怀疑……不,不应该是这样选择o1.shipName from Battles b1 natural join Outlets o1 join Battles b2 natural join Outlets o2其中o1.result=‘损坏’和b2.battleDate>b1.battleDate;现在的查询有3个自然连接和一个其中b2.battleDate>b1.battleDate保证返回0行。
natural join
(Battles b2 natural join Outcomes o2)