请教:子查询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
相关产品推荐
相关产品推荐

