2017-08-20 84 views
-1

理解此查詢有些麻煩,特別是子查詢中的WHERE。我並沒有真正瞭解它正在完成什麼。任何幫助,將不勝感激。謝謝SQL加入查詢需要明確性

# Find the largest country (by area) in each continent. Show the continent, 
# name, and area. 
SELECT continent, name, area 
FROM countries AS a 
WHERE area = (
SELECT MAX(area) 
FROM countries AS b 
WHERE a.continent = b.continent 
) 
+0

我知道你問的是來自學習網站,但不記得是哪一個。這已被問過很多次,但不知道你試圖從中學習的網站起源,無法找到。嘗試對該網站名稱進行搜索並查看已經出現的答案。 – DRapp

回答

0

子查詢查找國家的最大面積。哪些國家?在外部查詢中與該國大陸相匹配的所有國家/地區。

因此,對於每個國家來說,它都是同一大陸上最大的國家的面積。

WHERE條款接着說:「這兩個區域是否相同 - 這個國家的最大面積和麪積?」。它只選擇具有最大面積的國家。

+0

感謝您的幫助 – jsc42

1

考慮國家數據的子集:

 
Continent  Country Area 
North America USA  3718691 
North America Canada 3855081 
North America Mexico 761602 
Europe   France 211208 
Europe   Germany 137846 
Europe   UK  94525 
Europe   Italy 116305 

這是表現爲遵循相關查詢:

  1. 讀取外部查詢(北美,美國返回的第一行,37186​​91)
  2. 運行與a.continent,北美相關的子查詢,並返回3855081,這是北美最大的區域。
  3. 是否檢查3855081是否與我們正在處理的行上的區域相匹配。
  4. 它不匹配,所以外部查詢中的下一行被讀取,我們從第1步開始,這次在第二行上工作。
  5. 對外部查詢中的所有行重複。

    當我們查看第2行和第4行時,第4步將匹配,以便這些行將由查詢返回。

    您可以在您的國家/地區表中使用此數據並運行查詢來檢查結果。

    請注意,這是一個非常糟糕的方式來確定每個國家最大面積的國家,因爲它重複每個國家的子查詢。使用我的樣本數據,它確定了北美的最大面積3倍,歐洲的最大面積4倍。

由於您在您的評論問,我會寫出如下這個查詢:

SELECT a.continent, a.name, a.area 
FROM countries AS a 
    inner join (select continent, max(area) max_area 
       from countries 
       group by continent) as b on a.continent = b.continent 
WHERE a.area = b.max_area 

在這個版本的查詢,每個大洲最高只有確定一次。原始查詢是爲了說明相關查詢而寫的,瞭解它們很重要。相關查詢通常可用於解決複雜的邏輯。

+0

這是非常有用的,真的很感謝細節。什麼是更有效的方式來運行此查詢? – jsc42

+0

@ jsc42將我的查詢版本添加到答案 – LAS

+0

因此,通過加入子查詢,您可以一次性將子查詢結果作爲A表添加到國家/地區,而無需重複運行它?如果是這樣,那實際上對我更有意義。 – jsc42