内部和外部联接之间的差异

时间:2016-01-23 14:52:33

标签: mysql join server

我没有区分INNER JOINLEFT OUTER JOIN之间的区别。 INNER JOIN是我给出的解决方案。我想出了LEFT OUTER JOIN的想法。两者都有效,但最佳解决方案是什么?

为什么我要加入INNER?

SELECT * 
FROM world.city  
INNER JOIN country ON (world.country.code=world=world.city.countryCode)  
WHERE continent = "North America"

我自己的解决方案是:

SELECT City.Name, City.Population, City.CountryCode  
FROM City  
LEFT OUTER JOIN Country ON City.CountryCode = Country.Code  
WHERE Country.Continent = "North America"

为什么这是一个糟糕的解决方案?

为什么SQL知道大陆属于表country而不属于表"城市"?(如Country.Continent

4 个答案:

答案 0 :(得分:1)

由于您的WHERE子句在联接表Country中包含条件,因此您实际上在第二个查询中强制INNER JOIN。如果您在ON子句中放置该条件,您会看到不同的结果。在您的第二个示例中,这将产生Country表中的所有行,而不仅仅是您想要的行。

答案 1 :(得分:1)

内部联接:它将给所有拥有国家代码的城市。意味着它将跳过没有相应行的国家和城市

左外连接:这将为您提供左表首选项的连接。如果右表中的相应键不存在,即使它将显示城市,即使国家为空也将为所有城市提供

右外连接:如果左表中没有键,则更喜欢右表。它还将包括城市中没有城市的国家

答案 2 :(得分:0)

以下是JOINS

的区别图片

enter image description here

答案 3 :(得分:0)

@ wogsland解释了为什么使用外连接的查询是一个糟糕的解决方案。这是你的另一个问题:"为什么SQL知道大陆属于表国家而不属于表"城市"?(如Country.Continent)"

SQL知道city表中的列。如果有一个叫做大陆,你的查询就会抛出一个错误。消息从RDBMS到RDBMS各不相同,但它的含义与模糊列名称有关。我没有使用mySQL,所以我不知道他们的具体措辞。