MySQL技术问询:统计含城市国家的城市数量与平均人口
问题解决与说明
正确查询语句
要实现需求,需要用INNER JOIN关联两个表,同时按国家分组做聚合统计,正确语句如下:
SELECT country.code AS CountryCode, country.name AS CountryName, COUNT(city.id) AS NumberOfCities, AVG(city.population) AS AverageCityPopulation FROM world.country INNER JOIN world.city ON country.code = city.CountryCode GROUP BY country.code, country.name;
你的查询错误分析
- 错误选择字段:你选了
city.name和city.countrycode,但统计是按国家分组,这类非分组键、非聚合函数的字段会导致结果异常(MySQL非严格模式下返回随机值,严格模式直接报错)。 - 错误的过滤条件:
WHERE city.CountryCode > 1完全无效,CountryCode是字符串类型的国家代码,不是数字,这个条件误过滤了绝大多数数据,只留下了刚好符合错误逻辑的阿鲁巴数据。 - 缺少分组语句:使用
AVG这类聚合函数时,必须用GROUP BY指定分组维度,否则只会返回全局单一结果。
JOIN记忆技巧
把两个表看成左右两个集合,用简单逻辑记:
INNER JOIN:取交集,只保留两边能匹配上的数据(刚好符合你“至少有一个城市的国家”的需求)。LEFT JOIN:左表全留,右表只留匹配的,没匹配的补NULL(比如要查所有国家,包括没有城市的,就用country LEFT JOIN city)。RIGHT JOIN:右表全留,左表只留匹配的,没匹配的补NULL,实际用得少,它等价于把左右表调换后的LEFT JOIN,比如A RIGHT JOIN B=B LEFT JOIN A,记牢LEFT JOIN就够。
学习资源推荐
- 入门教程:MySQL官方文档入门板块,菜鸟教程MySQL专区,W3Schools MySQL教程
- YouTube频道:MySQL Tutorial(基础讲解细致),Programming with Mosh(MySQL快速入门系列),TechWorld with Nana(数据库系统讲解)
- 论坛社区:Stack Overflow(搜MySQL问题基本都有解答),MySQL官方论坛,国内的CSDN、掘金MySQL板块
内容的提问来源于stack exchange,提问作者benny
相关产品推荐
相关产品推荐

