加入

2016-01-23 13 views
-1

我沒有得到這個INNER JOINLEFT OUTER JOIN之間的區別。 INNER JOIN是我給出的解決方案。我想出了這個想法與LEFT OUTER JOIN。兩者都可以工作,但最好的解決方案是什麼?加入

爲什麼我做了INNER JOIN這裏?

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

兩個選擇都會返回相同的結果,因爲外部連接在邏輯上等同於內部連接:*給我所有已知大陸爲「北美」*的城市。這是一個糟糕的解決方案,如果優化是沒有足夠的智慧認識到,其實第一次加入所有的行,然後過濾結果(我不知道如果MySQL仍然是愚蠢的)。將「AND continent =」North America「」移到「ON」時,它將返回所有城市,但對於其他所有大洲則爲「NULL」。 – dnoeth

回答

1

內部聯接,它會把所有,它們是具有國家代碼.means它會跳過不具有相應的行

LEFT OUTER JOIN的國家和城市的城市:這會給你用左表優先連接。如果右表對應的鍵不存在,即使它會顯示城市,它會給所有城市即使國家爲空

右外連接:這將傾向於右表如果密鑰不存在於左表。它還將包括它的城市是不存在的城市表

1

因爲你WHERE條款包括在連接表Country的條件時,實際上是迫使INNER JOIN在你的第二個查詢中。如果您在ON條款中將條件放在哪裏,您會看到不同的結果。在你的第二個例子中,這將產生Country表中的所有行,而不是你想要的。

+0

好吧,請你給我一個例子,在接通狀態給了我不同的結果? – Nyht

+0

增加了你的第二個查詢會發生的事情。 – wogsland

0

這裏有差別的圖像JOINS

enter image description here

0

@ wogsland的解釋了爲什麼使用外連接的查詢是一個壞的解決方案的國家。這是你的另一個問題:「爲什麼SQL知道大陸屬於表的國家,而不是表‘城市’(如Country.Continent)?」

SQL知道在城市表中的列。如果有一個叫做大陸的,你的查詢就會產生錯誤。該消息從RDBMS到RDBMS各不相同,但是這是詞彙模糊的列名的結果。我不使用mySQL,所以我不知道他們的具體措辭。