小技巧


1、SQL查询时,如果有聚合函数,那么所选择的列必须为分组列(就是放在group by之后的那些列)
select ename,max(sal) from emp;//select 后面不能写 ename字段
ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'work.emp.ENAME'; this is incompatible with sql_mode=only_full_group_by

 

2 、为什么mysql having的条件表达式可以直接使用select后的别名?

 

SQL的执行顺序

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> UNION -> ORDER BY -> LIMIT

 

因此一般不能在having condition中使用select list中的alias。

但是mysql对此作了扩展。在mysql 5.7.5之前的版本,ONLY_FULL_GROUP_BY sql mode默认不开启。在5.7.5或之后的版本默认开启。

如果ONLY_FULL_GROUP_BY sql mode不开启,那么mysql对标准SQL的扩展可以生效:

  1. 允许在select list、having condition和order by list中使用没有出现在group by list中的字段。此时mysql会随机选择没有出现在group by list中的字段的值。效果和使用ANY_VALUE()是相同的。
  2. 允许在having condition中使用select list中的alias

 


 

posted @ 2020-11-28 09:20  棉花糖88  阅读(61)  评论(0)    收藏  举报