mysql使用group by出现1055报错 mac环境

本文介绍了解决MySQL中使用Group By时出现的1055错误的方法。该错误通常发生在开启了ONLY_FULL_GROUP_BY模式下,尝试从查询结果中选择未在Group By子句中出现且未使用聚合函数的列。文章提供了如何调整sql_mode以禁用ONLY_FULL_GROUP_BY选项的步骤。

mysql使用group by出现1055报错 mac环境

mysql> select * from emp group by gender;
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'db01.emp.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

之所以说这种查找方式不合理,是因为ONLY_FULL_GROUP_BY这个属性是规定了查找的位置只能是group by后面的那个字段,如果你select 后面涉及到其他字段,就会出错,你select 后面能加其他的字段必须是聚合函数或者是group by 后面的那个字段。

分析原因:

终端登录MySQL,输入并执行:select @@global.sql_mode;

得到:

+-----------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                                                     |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

出错原因,因为默认开了ONLY_FULL_GROUP_BY这个属性,和想要执行的group by 方式相冲突。

解决方法:

将ONLY_FULL_GROUP_BY这个属性去掉:

上面查看了属性有这些:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

于是将ONLY_FULL_GROUP_BY去掉,保留其他的。

得到:

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

之所以按照上面的做,因为你的属性可能和我不完全一样,所以直接复制我的代码有可能不成功。

然后将这一段代码放到下面这段的’ '里

执行下行代码(如果出错,要按照上面所说的,根据自己终端查到的属性,把’ ’ 里面的改一下):

set global sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

最后你得输入exit或者quit退出一下mysql的客户端,然后重新登录一次,本次设置才会生效。

需要说明的是 这个设置 并不是永久有效的 服务端重启就还原 只是测试查看一下
最好不要使用select * from table名 group by post; 这种查找方式。

### 如何在 MySQL 中正确使用 WHERE 和 GROUP BY 子句 在 SQL 查询中,`WHERE` 子句用于过滤记录,而 `GROUP BY` 子句则用于将数据分组以便执行聚合操作。当两者一起使用时,需要注意一些特定的规则和约束条件。 #### 错误原因分析 如果查询运行时报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'day_offset' which is not functionally dependent on columns in GROUP BY clause”,这通常是因为启用了 `sql_mode=only_full_group_by` 的模式[^1]。在这种情况下,SQL 要求所有未被聚合函数处理的列都必须显式地包含在 `GROUP BY` 列表中。 --- #### 解决方案一:调整查询逻辑以满足 `ONLY_FULL_GROUP_BY` 可以通过修改查询来确保所有非聚合字段都在 `GROUP BY` 子句中列出。例如: ```sql SELECT day_offset, COUNT(*) AS count FROM table_name WHERE condition_column = some_value GROUP BY day_offset; ``` 在这个例子中,`day_offset` 是一个普通的列而不是聚合列,因此它需要出现在 `GROUP BY` 子句中。 --- #### 解决方案二:禁用 `ONLY_FULL_GROUP_BY` 模式 另一种方法是在配置文件中关闭 `ONLY_FULL_GROUP_BY` 模式。对于 Mac 环境下的 MySQL 配置,可以编辑 `my.cnf` 文件并添加以下内容[^2]: ```ini [mysqld] sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' ``` 保存后重启 MySQL 服务即可生效。这样可以让 MySQL 接受更宽松的语法标准,允许某些不符合严格规范的查询通过验证。 > **注意**: 关闭此选项可能会带来潜在的数据一致性风险,请谨慎评估业务需求后再决定是否采用该方式。 --- #### 示例代码 下面是一个完整的示例展示如何同时使用 `WHERE` 和 `GROUP BY` 子句: 假设有一个名为 `sales` 的表格结构如下: | id | product_id | sale_date | |----|------------|-----------------| | 1 | A | 2023-01-01 | | 2 | B | 2023-01-01 | | 3 | C | 2023-01-02 | 我们希望统计每天销售的产品数量,并仅考虑产品 ID 不为空的情况,则可编写如下查询语句: ```sql SELECT sale_date, COUNT(product_id) AS total_sales FROM sales WHERE product_id IS NOT NULL GROUP BY sale_date; ``` 上述查询会返回按日期分组的结果以及每组内的总销售额数。 --- #### 注意事项 即使解决了当前问题,在实际开发过程中仍需遵循良好的数据库设计原则,比如合理设置索引、优化查询性能等措施,从而提升系统的整体效率与稳定性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值