ause java.sql.SQLSyntaxErrorException Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'dayou_wms_dj.b.config_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by ; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'dayou_wms_dj.b.config_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 2025-04-24 170715.926 ERROR 4928 --- [nio-9129-exec-4] c.w.a.c.w.m.WorkOrderOperationController WorkOrderOperationStatisticalParam err ### Error querying database. Cause java.sql.SQLSyntaxErrorException Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'g.status' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=on
时间: 2025-04-24 08:28:11 浏览: 38
<think>好的,用户遇到了SQL查询错误,具体是'Expression #6 of SELECT list is not in GROUP BY clause',而且问题出在sql_mode=only_full_group_by模式下。我需要帮他解决这个问题。
首先,我得回忆一下这个错误的常见原因。根据引用[1]到[4]的内容,这个错误是因为在SELECT列表中选择了没有被聚合的列,而且这些列不在GROUP BY子句中,而数据库的sql_mode设置为only_full_group_by。这说明用户的SQL语句不符合这个模式的严格要求。
接下来,我需要考虑解决方法。通常有两种主要途径:修改SQL查询语句使其符合要求,或者调整sql_mode设置。用户可能更倾向于修改查询,因为直接改变数据库设置可能会影响其他查询的严格性。
对于修改SQL查询,需要检查GROUP BY子句是否包含所有SELECT中的非聚合列。比如,如果SELECT中有列A、B,而GROUP BY只有列A,那么列B必须使用聚合函数如MAX、MIN等。例如,引用[2]和[3]中的例子都是这种情况,非聚合列不在GROUP BY里导致错误。所以用户需要检查他们的SELECT列表,确保所有非聚合列都被包含在GROUP BY中,或者对这些列应用聚合函数。
另一个方法是调整sql_mode,如引用[5]提到的,可以通过SET命令临时或永久修改sql_mode,移除ONLY_FULL_GROUP_BY。但需要注意,这样做可能会降低查询的严谨性,导致潜在的数据不一致问题。比如,在GROUP BY时选择未明确的列可能返回不确定的值,影响结果准确性。
用户可能不熟悉如何正确修改SQL语句,或者不确定哪些列需要聚合。这时候需要举例说明,比如给出修改前后的对比,帮助他们理解如何调整查询。此外,用户可能使用ORM框架如Mybatis,如引用[2]中的情况,这时候需要确保生成的SQL符合要求,可能需要手动调整映射文件中的SQL语句。
另外,用户可能需要知道如何查看当前的sql_mode设置,引用[5]给出了相关的查询命令,比如SELECT @@sql_mode; 这可以帮助他们确认问题是否确实由ONLY_FULL_GROUP_BY引起。
最后,需要提醒用户权衡两种方法的利弊。修改SQL是推荐的做法,因为它保证了查询的准确性和可维护性,而调整sql_mode可能更适合临时解决方案或特定场景。还要注意,生产环境中修改全局设置可能影响其他应用,需谨慎处理。
总结一下,解决方案分步骤:1. 检查并修改SQL语句,确保GROUP BY包含所有非聚合列或使用聚合函数;2. 如果必要,调整sql_mode设置,但需注意潜在风险。同时,提供具体示例和命令,帮助用户实际操作。</think>### 解决方案:解决 `sql_mode=only_full_group_by` 导致的非聚合列错误
#### 问题根源
错误 `Expression #6 of SELECT list is not in GROUP BY clause` 是由于MySQL的`sql_mode`设置为`ONLY_FULL_GROUP_BY`时,要求`SELECT`列表中的所有非聚合列必须明确包含在`GROUP BY`子句中[^4][^5]。如果未满足这一条件,MySQL会拒绝执行查询。
---
### 方法1:修改SQL查询(推荐)
#### 步骤1:检查`GROUP BY`与`SELECT`列的匹配性
- **规则**:`SELECT`列表中的列必须满足以下任一条件:
1. 被聚合函数包裹(如`SUM()`、`MAX()`、`COUNT()`);
2. 明确包含在`GROUP BY`子句中。
**错误示例**:
```sql
SELECT name, age, SUM(score)
FROM students
GROUP BY name; -- age未在GROUP BY中,也未使用聚合函数
```
**修复方法**:
1. **扩展`GROUP BY`子句**:
```sql
SELECT name, age, SUM(score)
FROM students
GROUP BY name, age; -- 将age加入GROUP BY
```
2. **使用聚合函数包裹非聚合列**:
```sql
SELECT name, MAX(age), SUM(score)
FROM students
GROUP BY name; -- 对age使用MAX函数
```
---
### 方法2:调整`sql_mode`(谨慎使用)
#### 步骤1:临时修改会话级配置
```sql
-- 移除ONLY_FULL_GROUP_BY
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
```
#### 步骤2:永久修改全局配置(需权限)
1. 编辑MySQL配置文件(如`my.cnf`或`my.ini`):
```ini
[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
```
2. 重启MySQL服务:
```bash
systemctl restart mysql # Linux
```
**风险提示**:禁用`ONLY_FULL_GROUP_BY`可能导致非确定性查询结果[^5]。
---
### 实际案例
**原错误SQL**:
```sql
SELECT department, employee_name, SUM(sales)
FROM sales_records
GROUP BY department; -- employee_name未在GROUP BY中
```
**修复后**:
```sql
SELECT department, MAX(employee_name), SUM(sales)
FROM sales_records
GROUP BY department; -- 使用MAX聚合employee_name
```
---
### 总结
| 方法 | 适用场景 | 优缺点 |
|------------|-----------------------------------|--------------------------------------|
| 修改SQL | 需要长期稳定运行的生产环境 | 保证查询准确性,但需调整逻辑 |
| 调整sql_mode| 临时测试或兼容旧系统 | 快速修复,但可能引入数据不一致风险 |
建议优先通过**修改SQL语句**解决问题[^1][^4]。若需临时绕过,再考虑调整`sql_mode`[^5]。
---
阅读全文
相关推荐


















