MySQL报错1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated colu

报错内容如下:

1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'fbjs.mscc.ContactTime' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by, Time: 0.000000s

1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'fbjs.mscc.ContactTime' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by, Time: 0.000000s

前情提示:

测试数据库mysql5.6(centOS6.8)、mysql8.0(Mac)

5.6可以执行,8.0报错

测试SQL大致语句:

SELECT msc.CustomerID,msc.CustomerName,mscc.ContactTime FROM membership_customer msc LEFT JOIN membership_customercontact mscc ON (msc.CustomerID = mscc.CustomerID AND  mscc.`Status` = 1 ) WHERE msc.`Status` !=4 AND (msc.FollowUpStatus = 2 OR msc.FollowUpStatus = 3 OR msc.`Status` = 6) GROUP BY msc.CustomerID ORDER BY mscc.ContactTime DESC
SELECT msc.CustomerID,msc.CustomerName,msc.AddTime AS CreateTime,msc.EmployeeID,he.EmployeeName,mscc.ContactTime FROM membership_customer msc LEFT JOIN membership_customercontact mscc ON (msc.CustomerID = mscc.CustomerID AND  mscc.`Status` = 1 ) LEFT JOIN human_employee he ON he.EmployeeID = msc.EmployeeID WHERE msc.`Status` !=4 AND (msc.FollowUpStatus = 2 OR msc.FollowUpStatus = 3 OR msc.`Status` = 6) AND msc.EmployeeID = '1' GROUP BY msc.CustomerID ORDER BY mscc.ContactTime DESC

在mysql5.7以上的版本中,对于 group by 的这种聚合操作,如果在select 中的列,没有在group by 中出现,那么这个SQL是不合法的,因为列不在group by的从句中,所以对于设置了这个mode的数据库,在使用group by 的时候,就要用MAX(),SUM(),ANT_VALUE()的这种聚合函数,才能完成GROUP BY 的聚合操作
参考文档:

https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-setting

Mode Changes in MySQL 5.7.

ONLY_FULL_GROUP_BY的设定,将不允许查询字段包括非聚集列

查询mysql服务器版本:以下命令在终端或者navicat中输入执行均可。
select @@version

#查看sql_mode的语法

SELECT @@GLOBAL.sql_mode;

SELECT @@SESSION.sql_mode;
显示结果:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

5.6.22-enterprise-commercial-advanced企业版sql_mode默认:

STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

方法一:

查询mysql 1055错误码发现问题为在mysql的配置中如果设置了sql_mode包含ONLY_FULL_GROUP_BY值得话,在进行查询时必须要将select的字段都包含在group by 中。
即 select a,b from xxx group by a,b
否则就会报错


方法二:

#修改sql_mode的语法

通过修改配置文件my.cnf来解决这个问题的。
1. 关闭正在运行的mysql
2. 修改/etc/my.cnf,将sql_mode=中的only_full_group_by给删掉
3. 重启mysql,再执行出错的sql发现能成功执行了

如果没有my.cnf文件,解决方式查看(有模板)https://blog.csdn.net/qq_31708763/article/details/104357798

默认优先选取/etc/my.cnf这个是启动脚本里轮询的第一个位置。

推荐使用更改my.cnf方法更改sql_mode,以防止后续重启mysql服务或者服务器配置失效。另外提一句,8.0版本目前测试是在my.cnf中配置忽略大小写无用,除非在数据库初始化时候指定,估计是高版本更新都是这样。

sql_mode常用值:

ONLY_FULL_GROUP_BY: 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP
BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中
 
NO_AUTO_VALUE_ON_ZERO: 该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户
希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。
 
STRICT_TRANS_TABLES: 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制
NO_ZERO_IN_DATE: 在严格模式下,不允许日期和月份为零
 
NO_ZERO_DATE: 设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。
 
ERROR_FOR_DIVISION_BY_ZERO: 在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如
果未给出该模式,那么数据被零除时MySQL返回NULL
 
NO_AUTO_CREATE_USER: 禁止GRANT创建密码为空的用户
 
NO_ENGINE_SUBSTITUTION:
如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
 
PIPES_AS_CONCAT:
将”||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似
 
ANSI_QUOTES: 启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符

方法三:修改global sql_mode:

SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

修改之后,重新新建查询,测试结果OK,如下图:

因为方法3太方便了,也无须管配置文件,只需在命令行或者客户端软件执行SQL语句就行,接下来测试重启mysql服务此法是否依旧有效。(此处直接重启了电脑)

sudo /usr/local/mysql/support-files/mysql.server start
sudo /usr/local/mysql/support-files/mysql.server stop


sudo /usr/local/mysql/support-files/mysql.server restart

重启后测试无效。恢复原来的了。

 

最后,推荐使用方法二,更改配置文件,Mac下注意目录权限问题,如果需要也可以在系统偏好设置里指定配置文件位置,如下图所示:

  • 13
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
引用:1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'senior_two.score.student_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 。 引用:这个错误是由于 MySQL 的新版本中默认开启了ONLY_FULL_GROUP_BY模式,即在 GROUP BY 语句中的 SELECT 列表中,只能包含分组或聚合函数,不能包含其他列。而你的查询语句中出现了一个列senior_two.score.student_id,它既没有被分组也没有被聚合,因此 MySQL 报出了这个错误。 。 引用:如果启用了only_full_group_by SQL模式(在默认情况下是这样),那么MySQL就会拒绝选择列表、条件或顺序列表引用的查询,这些查询将引用组中未命名的非聚合列,而不是在功能上依赖于它们。(在5.7.5之前,MySQL没有检测...。 根据引用,这个错误意味着在SELECT语句中的第二个表达式不在GROUP BY子句中,并且包含了一个非聚合的列'senior_two.score.student_id'。这与sql_mode=only_full_group_by模式不兼容。 根据引用,这个错误是由于MySQL的新版本中默认开启了ONLY_FULL_GROUP_BY模式。在GROUP BY语句的SELECT列表中,只能包含分组或聚合函数,不能包含其他列。而你的查询语句中出现了一个列'senior_two.score.student_id',它既没有被分组也没有被聚合,因此MySQL报出了这个错误。 如果你启用了only_full_group_by SQL模式(默认情况下是启用的),那么MySQL会拒绝选择列表、条件或顺序列表引用的查询,这些查询将引用组中未命名的非聚合列,而不是在功能上依赖于它们。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘se](https://blog.csdn.net/m0_61615803/article/details/130076452)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [解决大于5.7版本mysql的分组报错Expression #1 of SELECT list is not in GROUP BY clause and contains ...](https://download.csdn.net/download/weixin_38743076/13698627)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JaneYork

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值