You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请教:子查询WHERE语句的作用及无GROUP BY却与GROUP BY查询结果一致的原因

SQL关联子查询的执行逻辑疑问

以下是两段SQL查询语句:

/*
SELECT countries.name AS country, COUNT(*) AS cities_num
  FROM cities
    INNER JOIN countries
    ON countries.code = cities.country_code
GROUP BY country
ORDER BY cities_num DESC, country
LIMIT 9;
*/

SELECT name AS country,
  -- Subquery
  (SELECT count(*)
   FROM cities
   WHERE countries.code = cities.country_code) AS cities_num
FROM countries
ORDER BY cities_num DESC, country
LIMIT 9;

我原本认为上述未注释查询中的子查询会返回所有国家的城市总数,预期会出现错误,但实际它却得到了与上方带GROUP BY的查询相同的结果——即每个国家的城市数量。现请教:该未注释查询中的WHERE语句如何工作?为何无GROUP BY却能得到相同结果?


解答

这个未注释的查询里用的是关联子查询,和普通的独立子查询逻辑不同,它会和外层查询的每一行数据做绑定匹配:

  • WHERE语句的工作方式:外层查询会逐行读取countries表的记录,每拿到一条国家数据,就把当前行的countries.code值传入子查询的WHERE条件。此时子查询只会统计cities表里country_code等于当前国家code的记录数量,相当于给每个国家单独做一次针对性的COUNT统计。

  • 无需GROUP BY的原因:带GROUP BY的查询是先关联两张表,再按国家分组统计总数;而关联子查询是外层循环遍历每个国家,内层为每个国家单独计算城市数,每个外层行对应一个唯一的子查询结果,天然实现了“按国家统计”的效果,所以不需要额外添加GROUP BY语句,最终结果和GROUP BY版本完全一致。


内容的提问来源于stack exchange,提问作者Mehul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:40:36