小技巧
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的扩展可以生效:
- 允许在select list、having condition和order by list中使用没有出现在group by list中的字段。此时mysql会随机选择没有出现在group by list中的字段的值。效果和使用ANY_VALUE()是相同的。
- 允许在having condition中使用select list中的alias

浙公网安备 33010602011771号