2017-08-20 62 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