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

MySQL中GROUP BY与CASE语句内聚合函数的执行顺序疑问解析

SQL天气类型统计问题及技术解答

一、问题描述

表结构

Countries表

列名类型
country_idint
country_namevarchar

country_id是该表的主键,每行记录一个国家的ID和名称。

Weather表

列名类型
country_idint
weather_stateint
daydate

(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的执行流程大致如下:

  1. 先执行FROM和JOIN逻辑,关联两张表并筛选出2019年11月的有效数据;
  2. 接着执行GROUP BY w.country_id,把筛选后的数据按国家ID分组;
  3. 对每个分组计算聚合函数AVG(weather_state),得到每个国家的平均天气状态;
  4. 最后执行SELECT里的逻辑,用CASE WHEN根据分组后的平均值判断天气类型,同时取出对应的country_name。

所以CASE WHEN里的AVG(weather_state)是基于分组后的结果计算的,并不是等SELECT执行完才处理。代码里GROUP BY写在SELECT后面只是SQL的语法规则要求,但实际执行时是先完成分组和聚合计算,再处理SELECT中的字段和逻辑判断。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:45:47