SQL连接查询需要清晰度

时间:2017-08-20 21:33:10

标签: sql

在理解此查询时遇到一些问题,尤其是子查询中的WHERE。我真的没有得到它正在完成的东西。任何帮助,将不胜感激。感谢

# 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
)

2 个答案:

答案 0 :(得分: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是否与我们正在处理的行上的区域匹配的where相等。
  4. 它不匹配所以外部查询中的下一行被读取,我们从第一步开始,这次是在第二行工作。
  5. 对外部查询中的所有行重复。

    当我们查看第2行和第4行时,第4步将匹配,以便查询返回这些行。

    您可以在您的国家/地区表格中使用此数据并运行查询来检查结果。

    请注意,这是确定每个大陆最大面积的国家/地区的一种非常糟糕的方式,因为它会为每个国家/地区重复子查询。使用我的样本数据,它确定北美洲的最大面积3次,欧洲的最大面积4次。

  6. 由于您在评论中提到,我会按如下方式编写此查询:

    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
    

    在此版本的查询中,每个洲的最大值仅确定一次。编写原始查询是为了说明相关查询,理解它们很重要。相关查询通常可用于解决复杂逻辑。

答案 1 :(得分:0)

子查询正在寻找国家/地区的最大区域。哪些国家?在外部查询中匹配该国家大陆的所有国家。

因此,对于每个国家,它都会占据同一大洲最大国家的面积。

然后WHERE条款说“这两个区域是相同的 - 这个国家的最大面积和面积是多少?”。它只选择具有最大面积的国家。