场景一:报错 SELECT list
不在 GROUP BY clause
中。
1. java 报错示例
Error querying database. Cause: java.sql.SQLSyntaxErrorException: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column
2. 执行的 sql 语句
select a, b from table group by a
3. 原因分析
如上 sql 所示,我们知道 b 在 a 下是唯一的,group by a 且 b 是唯一的,那么把 b 写在 select 列表上从语法的角度来说的正确的。但是 msql 的 sql_mode 默认设置了一些语法的校验,其中的 ONLY_FULL_GROUP_BY
限制了使用 group by 的时候 select 的字段必须是 group by 里面的字段
。
4. 解决方案
# 1.1 查看当前会话 sql_mode 的配置
select @@sql_mode
# 1.2 查看全局 sql_mode 的配置
select @@GLOBAL.sql_mode;
# ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# 方案:去掉 sql_mode 的 ONLY_FULL_GROUP_BY
# 2. 临时解决方案:mysql重启失效
set @@GLOBAL.sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
# 3. 永久生效方案
# windows 修改 mysql 配置 my.ini (linux 是 mysql.cnf),在 [mysqld] 下面添加:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
附言:使用临时解决方案,已经开启的会话(session)是不会生效的,如 Navicate 打开的窗口、java 连接池里面的会话。需要重新获取连接。