You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动