SQLZoo教程问题6:如何不使用嵌套SELECT实现各洲最大面积国家查询
不用嵌套SELECT实现每个大洲面积最大国家的查询
嘿,很高兴你已经搞定嵌套子查询的版本了!要是不想用那种嵌套的SELECT语句(比如你之前可能用的WHERE area = (SELECT MAX(area) ...)这类相关子查询),这儿有俩靠谱的替代方法:
方法1:窗口函数(ROW_NUMBER/RANK)
窗口函数能帮我们按大洲分组,给每个组里的国家按面积从大到小排序,然后直接挑出排名第一的记录。逻辑直观,代码也清爽:
SELECT continent, name, area FROM ( SELECT continent, name, area, -- 按大洲分组,面积降序排,给每条记录打序号 ROW_NUMBER() OVER (PARTITION BY continent ORDER BY area DESC) AS rank_num FROM world ) AS ranked_countries WHERE rank_num = 1;
要是碰到某个大洲有多个国家面积并列最大的情况(虽然这个题目里大概率不会出现),把ROW_NUMBER()换成RANK()就行,这样会返回所有并列第一的国家。
方法2:GROUP BY + JOIN
先通过GROUP BY算出每个大洲的最大面积,再把这个结果和原表做JOIN,匹配大洲和对应的最大面积,就能拿到我们要的记录:
SELECT w.continent, w.name, w.area FROM world w -- 先聚合出每个大洲的最大面积 JOIN ( SELECT continent, MAX(area) AS max_continent_area FROM world GROUP BY continent ) AS continent_max_data ON w.continent = continent_max_data.continent AND w.area = continent_max_data.max_continent_area;
这种方法没有用WHERE子句里的嵌套子查询,而是通过JOIN关联聚合结果,完美避开了你想避免的嵌套写法。
这俩方法都能达到和你之前嵌套查询一样的效果,选哪个全看你自己的习惯啦~
内容的提问来源于stack exchange,提问作者kareem Emad




