我没有区分INNER JOIN
和LEFT 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
)
答案 0 :(得分:1)
由于您的WHERE
子句在联接表Country
中包含条件,因此您实际上在第二个查询中强制INNER JOIN
。如果您在ON
子句中放置该条件,您会看到不同的结果。在您的第二个示例中,这将产生Country
表中的所有行,而不仅仅是您想要的行。
答案 1 :(得分:1)
内部联接:它将给所有拥有国家代码的城市。意味着它将跳过没有相应行的国家和城市
左外连接:这将为您提供左表首选项的连接。如果右表中的相应键不存在,即使它将显示城市,即使国家为空也将为所有城市提供
右外连接:如果左表中没有键,则更喜欢右表。它还将包括城市中没有城市的国家
答案 2 :(得分:0)
答案 3 :(得分:0)
SQL知道city表中的列。如果有一个叫做大陆,你的查询就会抛出一个错误。消息从RDBMS到RDBMS各不相同,但它的含义与模糊列名称有关。我没有使用mySQL,所以我不知道他们的具体措辞。