MySQL中GROUP BY与CASE语句内聚合函数的执行顺序疑问解析
SQL天气类型统计问题及技术解答
一、问题描述
表结构
Countries表
| 列名 | 类型 |
|---|---|
| country_id | int |
| country_name | varchar |
country_id是该表的主键,每行记录一个国家的ID和名称。
Weather表
| 列名 | 类型 |
|---|---|
| country_id | int |
| weather_state | int |
| day | date |
(country_id, day)是该表的主键,每行记录一个国家某一天的天气状况。
查询需求
编写SQL查询,找出2019年11月每个国家的天气类型:
- 若
weather_state的平均值≤15,天气类型为Cold; - 若平均值≥25,天气类型为Hot;
- 否则为Warm。
结果表可按任意顺序返回。
二、MySQL解决方案
SELECT country_name, CASE WHEN AVG(weather_state) <= 15 THEN 'Cold' WHEN AVG(weather_state) >= 25 THEN 'Hot' ELSE 'Warm' END AS weather_type FROM Weather w JOIN Countries c ON w.country_id = c.country_id AND LEFT(w.day, 7) = '2019-11' GROUP BY w.country_id
三、技术疑问解答
你提到的“GROUP BY在SELECT语句之后执行”是个误解——SQL的实际执行顺序和代码书写顺序并不一致。标准SQL的执行流程大致如下:
- 先执行
FROM和JOIN逻辑,关联两张表并筛选出2019年11月的有效数据; - 接着执行
GROUP BY w.country_id,把筛选后的数据按国家ID分组; - 对每个分组计算聚合函数
AVG(weather_state),得到每个国家的平均天气状态; - 最后执行
SELECT里的逻辑,用CASE WHEN根据分组后的平均值判断天气类型,同时取出对应的country_name。
所以CASE WHEN里的AVG(weather_state)是基于分组后的结果计算的,并不是等SELECT执行完才处理。代码里GROUP BY写在SELECT后面只是SQL的语法规则要求,但实际执行时是先完成分组和聚合计算,再处理SELECT中的字段和逻辑判断。
内容的提问来源于stack exchange,提问作者ylyu1
相关产品推荐
相关产品推荐

