如何使用嵌套SQL查询统计各游戏类别中美国开发者开发的游戏数量(无数据时显示0)
统计各游戏类别中美国开发者开发的游戏数量(含0值)
这是个很常见的统计需求,要保证所有游戏类别都被展示——哪怕该类别没有美国开发者开发的游戏时显示0,核心是要先拿到所有游戏类别,再关联符合条件的开发者数据,而不是只筛选有美国开发者的类别。下面给你两种嵌套SQL的实现方式:
方式一:基于LEFT JOIN的嵌套查询
这种方式先获取所有唯一类别,再左连接筛选后的美国开发者游戏数据,性能相对更优,适合数据量较大的场景:
SELECT g.category, COUNT(us_games.gameID) AS usa_developer_game_count FROM ( -- 子查询1:获取所有存在的游戏类别(去重) SELECT DISTINCT category FROM Game ) g LEFT JOIN ( -- 子查询2:筛选出美国开发者开发的所有游戏 SELECT gameID, category FROM Game INNER JOIN Developer ON Game.developID = Developer.developerID WHERE Developer.country = 'USA' -- 注意匹配数据库中美国的存储值,比如可能是'United States' ) us_games ON g.category = us_games.category GROUP BY g.category ORDER BY g.category;
逻辑说明:
- 第一个子查询确保我们不会遗漏任何游戏类别,哪怕该类别下没有符合条件的游戏;
- 第二个子查询提前过滤出所有由美国开发者开发的游戏数据;
LEFT JOIN会保留所有类别,没有匹配的类别对应us_games.gameID为NULL,COUNT(us_games.gameID)会自动忽略NULL值,从而得到0;- 最后按类别分组统计,得到每个类别的对应数量。
方式二:基于标量子查询的实现
这种方式更直观,外层遍历所有类别,每个类别单独执行子查询统计数量,适合快速理解逻辑:
SELECT DISTINCT g.category, -- 子查询:统计当前类别下美国开发者开发的游戏数量 ( SELECT COUNT(*) FROM Game g2 INNER JOIN Developer d ON g2.developID = d.developerID WHERE d.country = 'USA' AND g2.category = g.category ) AS usa_developer_game_count FROM Game g ORDER BY g.category;
逻辑说明:
- 外层查询先获取所有唯一的游戏类别;
- 对每个类别,执行嵌套的子查询:统计该类别下关联到美国开发者的游戏数量,没有符合条件的游戏时,子查询会返回0;
- 最终直接输出每个类别及其对应的统计数。
注意:如果你的数据库中美国的存储值不是
'USA'(比如是'United States'),记得修改WHERE条件中的对应值,确保匹配正确。
内容的提问来源于stack exchange,提问作者Bilal Sheikh
相关产品推荐
相关产品推荐

