同事请假后从他手里接过的任务,发现他写的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
用这种写法代码看着简洁,更便于查看和修改