Mysql 内外联接的区别

Mysql 内外联接的区别,mysql,join,server,Mysql,Join,Server,我不知道这个内部连接和这个左侧外部连接之间的区别。内部连接是为我提供的解决方案。我想到了左外连接的想法。两者都有效,但最好的解决方案是什么 为什么我在这里做一个内部连接 SELECT * FROM world.city INNER JOIN country ON (world.country.code=world=world.city.countryCode) WHERE continent = "North America" 我自己的解决办法是: SELECT City.Name,

我不知道这个
内部连接和这个
左侧外部连接之间的区别。
内部连接
是为我提供的解决方案。我想到了左外连接的想法。两者都有效,但最好的解决方案是什么

为什么我在这里做一个内部连接

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
,而不属于表“city”?(如
country.contraction

因为您的
WHERE
子句在联接的表
country
上包含了一个条件,所以在第二个查询中实际上是在强制执行
内部联接。如果您在
ON
子句中将该条件放在何处,您将看到不同的结果。在第二个示例中,这将生成
国家
表中的所有行,而不仅仅是您想要的行。

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

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


右外部联接:如果左表中不存在键,则该联接将首选右表。它还将包括城市表中不存在城市的国家,以下是连接差异的图像


@wogsland解释了为什么使用外部联接的查询是一个糟糕的解决方案。这是您的另一个问题:“为什么SQL知道该大陆属于表国家而不是表“城市”?(比如country.contraction)


SQL知道city表中的列。如果有一个名为Continental的查询,您的查询将抛出一个错误。该消息因RDBMS而异,但其含义是一个模棱两可的列名。我不使用mySQL,所以我不知道它们的具体措辞。

好的,你能给我一个例子,ON条件给我一个不同的结果吗?在你的第二个查询中添加了会发生什么。两个选择返回相同的结果,因为外部连接在逻辑上等同于内部连接:请告诉我该大陆被称为“北美”的所有城市。如果优化器不够聪明,没有意识到这一点,那么这是一个糟糕的解决方案,它实际上首先连接所有行,然后过滤结果(我不知道MySQL是否仍然那么愚蠢)。当您将
和Continental=“North America”
移动到
上的
时,它将返回所有城市,但所有其他大陆的
NULL