MySQL关键字select、group by的执行顺序

 

同事请假后从他手里接过的任务,发现他写的sql语句中有这么一段

SELECT LEFT(ymd, 7)             AS ym,
       department,
       COUNT(DISTINCT order_no) AS cnt
FROM ods_order_stat_day
WHERE ym = '2022-05'
GROUP BY ym, department
HAVING SUM(amount) > 0;

照理说正常的执行顺序应该是from、group by、having最后是select,可是观察以上sql发现select后面第一列其实不是表中字段,而是用函数处理后的新的字段ym,即group by时并没有ym这个字段。那么group by ym能正常执行吗,执行顺序又该是什么样子?答案是可以的正常执行,并且执行顺序并没有发生改变。

为什么group by表中没有的字段不报错、还能按照正常顺序执行呢,其实这是因为MySQL引擎做的优化功能,执行上面的sql和下面是一样。

SELECT LEFT(ymd, 7)             AS ym,
       department,
       COUNT(DISTINCT order_no) AS cnt
FROM ods_order_stat_day
WHERE ym = '2022-05'
GROUP BY LEFT(ymd, 7), department
HAVING SUM(amount) > 0;

PS:如果分组字段需要经过处理从而写的特别长时,比如:

SELECT CASE order_cnt
           WHEN 0 THEN '非常差'
           WHEN 5 THEN '差'
           WHEN 10 THEN '良'
           WHEN 15 THEN '优'
           WHEN 20 THEN '非常棒'
           ELSE '无' END appraise
...
GROUP BY appraise

用这种写法代码看着简洁,更便于查看和修改

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值