1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column的解决办法
时间: 2023-11-09 16:02:10 浏览: 209
这个错误通常是因为在 SELECT 语句中,GROUP BY 子句中没有包含所有非聚合列。解决方法是将所有非聚合列都包含在 GROUP BY 子句中,或者使用聚合函数对非聚合列进行计算。
例如,如果你有以下 SQL 语句:
```
SELECT name, SUM(sales)
FROM sales_table
GROUP BY name;
```
但是你的表中还有其他列,比如 date,那么你需要将它也包含在 GROUP BY 子句中:
```
SELECT name, date, SUM(sales)
FROM sales_table
GROUP BY name, date;
```
如果你不想将 date 包含在 GROUP BY 子句中,可以使用聚合函数对它进行计算:
```
SELECT name, MAX(date), SUM(sales)
FROM sales_table
GROUP BY name;
```
相关问题
1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'studb.students.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
### MySQL `sql_mode=only_full_group_by` 导致的 GROUP BY 错误解决方案
#### 问题描述
当启用 `sql_mode=only_full_group_by` 模式时,MySQL 要求在 `GROUP BY` 查询中,所有非聚合列必须显式出现在 `GROUP BY` 子句中。如果未满足此条件,则会触发错误 1055,提示表达式不在 `GROUP BY` 子句中,并且包含非聚合列[^1]。
#### 报错原因
该错误的核心在于 SQL 的严格模式设置。具体来说,在 `ONLY_FULL_GROUP_BY` 模式下,MySQL 需要确保每组的结果具有明确的意义。这意味着对于每个分组,任何非聚合字段都需要与分组键存在函数依赖关系,或者直接被包含到 `GROUP BY` 中[^2]。
#### 解决方案一:修改查询逻辑
可以通过调整查询结构来解决问题。例如,将所有涉及的非聚合列加入到 `GROUP BY` 子句中:
```sql
-- 修改前
SELECT id, name, COUNT(*) AS count FROM table_name GROUP BY name;
-- 修改后
SELECT id, name, COUNT(*) AS count FROM table_name GROUP BY id, name;
```
通过这种方式可以消除歧义并符合 `ONLY_FULL_GROUP_BY` 的要求[^3]。
#### 解决方案二:移除 `ONLY_FULL_GROUP_BY` 模式
如果不希望强制遵循这一规则,可以选择禁用 `ONLY_FULL_GROUP_BY` 模式。以下是具体的实现方式:
##### 方法 A:临时更改 session 级别的 sql_mode 设置
可以在当前会话中动态关闭 `ONLY_FULL_GROUP_BY` 模式而不影响全局配置:
```sql
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
```
这种方法仅适用于当前连接范围内的操作[^4]。
##### 方法 B:永久修改 my.cnf 文件中的 sql_mode 参数
编辑 MySQL 配置文件(通常是 `/etc/my.cnf` 或 `/etc/mysql/my.cnf`),找到或添加如下内容:
```ini
[mysqld]
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
```
保存后重启 MySQL 服务即可生效。注意,这会影响整个实例的行为,需谨慎评估其潜在风险[^5]。
#### 示例代码展示
假设有一张表名为 `students`,其中包含三列分别是 `id`, `name`, 和 `score`。我们尝试统计每位学生的平均分数但遇到了上述错误。
原始查询可能如下所示:
```sql
SELECT id, name, AVG(score) FROM students GROUP BY name;
```
修正后的两种写法分别为:
- **方法一** 将额外字段加至 group by 后面:
```sql
SELECT id, name, AVG(score) FROM students GROUP BY id, name;
```
- **方法二** 使用子查询先获取唯一记录再计算均值:
```sql
SELECT t.name, AVG(t.score) FROM (SELECT DISTINCT id, name, score FROM students) AS t GROUP BY t.name;
```
以上任选一种均可规避原有约束带来的冲突。
---
1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xs.xsda.学号' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
### MySQL中sql_mode=only_full_group_by导致的GROUP BY错误解决方案
MySQL 5.7及以上版本默认启用了`sql_mode=only_full_group_by`模式,这会导致在执行`GROUP BY`查询时,如果`SELECT`列表中包含未聚合的列且这些列不在`GROUP BY`子句中,则会报错。例如,错误代码1055表示`SELECT`列表中的表达式不在`GROUP BY`子句中,并且包含非聚合列[^1]。
#### 解决方案一:修改SQL语句
可以通过调整SQL语句来满足`sql_mode=only_full_group_by`的要求。具体方法是将所有出现在`SELECT`列表中的非聚合列添加到`GROUP BY`子句中。例如:
```sql
SELECT column1, column2, COUNT(*)
FROM table_name
GROUP BY column1, column2;
```
这样可以确保`SELECT`列表中的所有非聚合列都在`GROUP BY`子句中出现,从而避免报错[^4]。
#### 解决方案二:关闭`only_full_group_by`
如果确认业务逻辑不需要严格遵循`only_full_group_by`规则,可以通过修改MySQL配置文件或动态更改`sql_mode`来禁用该模式。以下是两种实现方式:
1. **动态修改`sql_mode`**
在当前会话或全局范围内临时禁用`only_full_group_by`模式:
```sql
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
```
或者完全清除`sql_mode`中的`ONLY_FULL_GROUP_BY`部分:
```sql
SET GLOBAL sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
```
注意:这种方式仅对当前会话或重启前生效[^2]。
2. **修改MySQL配置文件**
编辑MySQL配置文件(通常是`my.cnf`或`my.ini`),找到或添加`sql_mode`配置项,并移除`ONLY_FULL_GROUP_BY`:
```ini
[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
```
保存后重启MySQL服务以使更改生效[^3]。
#### 解决方案三:使用函数依赖性
如果数据表中的某些列具有函数依赖性(即可以通过`GROUP BY`子句中的列唯一确定),可以通过明确声明这种依赖关系来避免报错。例如:
```sql
SELECT column1, MAX(column2)
FROM table_name
GROUP BY column1;
```
在这种情况下,`column2`依赖于`column1`,因此不会触发`only_full_group_by`限制[^5]。
---
### 示例代码
以下是一个完整的示例,展示如何通过修改SQL语句解决`GROUP BY`错误:
```sql
-- 原始SQL语句,可能会报错
SELECT id, name, COUNT(*)
FROM users
GROUP BY id;
-- 修改后的SQL语句,符合only_full_group_by要求
SELECT id, name, COUNT(*)
FROM users
GROUP BY id, name;
```
如果需要禁用`only_full_group_by`,可以使用以下命令:
```sql
SET GLOBAL sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
```
---
阅读全文
相关推荐













