1. 问题来源
以deptno分组查询,显示每组sal的最大值以及对应ename
SELECT ename, MAX(sal), deptno FROM emp GROUP BY deptno;
error:1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'db01.emp.ename' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
2.错误分析
从error中可以看出,问题在于ename以及sql_mode=only_full_group_by
经查询,only_full_group_by要求SELECT target list中的所有列的值都具有明确意义,即①ename需要同sal一样被MAX、MIN、AVG等聚合函数所包含,或②同deptno一样位于GROUP BY表达式中。
3.解决方案
(1) MySQL提供了any_value()函数,但要注意,该函数会选择被分到同一组的数据里第一条数据的指定列值作为返回数据,也就是说结果中MAX(sal)对应的ename值可能并不是该sal实际对应的ename,因此该方式需要根据实际情况使用。
(2) 更改MySQL的配置,找到配置文件my.cnf,删除sql_mode中的only_full_group_by
(3) 降低MySQL版本至5.7以下(有风险)
(4) 老老实实修改SQL语句