关于MySQL8.x group_by报错的4种解决方案

 更新时间:2024年06月06日 09:48:52   作者:csdn_aspnet  
这篇文章主要介绍了关于MySQL8.x group_by报错的4种解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

MySQL8.x group_by报错解决方案

在我们使用MySQL的时候总是会遇到各种各样的报错,让人头痛不已。

其中有一种报错,sql_mode=only_full_group_by,十分常见,每次都是老长的一串出现,然后带走你所有的好心情,如:

 LIMIT 0, 1000 Error Code: 1055. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.tab_test.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 0.063 sec

由于本地安装得mysql版本未报错,但是服务器上的版本报错:

  • 本机版本:

  • 服务器版本:

不知道是8.x哪个版本之后SQL_MODE解除了限制,还是安装与解压版的的区别,目前发现的问题是服务器解压版应该是ini未设置SQL_MODE模式。

出现这样的报错,并不是因为你的代码写得不好,而是因为在MySQL 5.7后,MySQL默认开启了SQL_MODE严格模式,对数据进行严格校验。如果代码中含有group by聚合操作,那么select中的列,除了使用聚合函数之外的,如max()、min()等,都必须出现在group by中。

比如说,出现下面这种情况,就会报错:

select id,aa from tab_test group by aa

如果改成这个样子:

select id,aa from tab_test group by id,aa

或者这个样子:

select aa from tab_test group by aa

就不会报错了。

当然,这样子随意的改动代码,我们可能就无法得到想要的信息了。

我们可以通过以下四种方法,解决该问题:

方法一:直接修改数据库配置

首先,打开数据库,输入

select @@global.sql_mode;

这个时候,就会返回得到以下的信息:(不同电脑返回的信息可能不同)

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

如果里面包含 ONLY_FULL_GROUP_BY,那么就重新设置,在数据库中输入以下代码,去掉ONLY_FULL_GROUP_BY即可:

SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

但是,当我们再一次重新启动数据库时,可能会恢复原样,还是会出现ONLY_FULL_GROUP_BY的报错,这就需要我们再一次修改数据库配置。

那有没有可以永久生效的办法呢?当然有!参考方法二,就可以使修改数据库配置永久生效!

方法二:修改数据库配置(永久生效)

修改配置文件my.ini

在[mysqld]模块下新增一行配置:

sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

运行后重启,即可生效

方法三:使用 any_value() 或 group_concat()

1. any_value():将分到同一组的数据里第一条数据的指定列值作为返回数据。 (any_value()函数就是MySQL提供的用来抑制ONLY_FULL_GROUP_BY值被拒绝的)

select a,any_value(b) from test group by a

2. group_concat():将分到同一组的数据默认用逗号隔开作为返回数据,如下图:

方法四:开动脑筋,修改代码

举个例子,在牛客的第206题中,就出现了类似的情况

SQL206 获取每个部门中当前员工薪水最高的相关信息

题目如下:

示例:

如果我们不用上面的方法,直接用下面这种方式查询,很明显会出现 ONLY_FULL_GROUP_BY 的报错:

select dept_no,d.emp_no,max(s.salary) 
from dept_emp d 
join salaries s on d.emp_no = s.emp_no
group by d.dept_no

我们可以换一种思路:

首先查询得到2张表,一张表为员工薪资表 表a,一张表为每个部门最高员工薪资表 表b。然后通过表连接 on d.emp_no = s.emp_no 使这两张表结合,通过on a.salary = b.salary使薪资统一,即这两张表连接后的表的薪资为每个部门的最高员工薪资。最后,再通过一次查询得到每个部门中当前员工薪水最高的相关信息。

select a.dept_no, a.emp_no, b.salary
from
    (select d.dept_no, s.emp_no, s.salary
     from dept_emp as d join salaries as s 
     on d.emp_no = s.emp_no 
    ) as a
    join
    (select d.dept_no, max(s.salary) as salary
     from dept_emp as d join salaries as s 
     on d.emp_no = s.emp_no
     group by d.dept_no
    ) as b 
    on a.salary = b.salary and a.dept_no = b.dept_no
order by a.dept_no

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL组合索引与最左匹配原则详解

    MySQL组合索引与最左匹配原则详解

    这篇文章主要给大家介绍了关于MySQL组合索引与最左匹配原则的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • MySQL数据库之表的约束图文详解

    MySQL数据库之表的约束图文详解

    在数据库设计中,表约束是保证数据完整性、一致性的重要手段,数据类型本身就是一种基本约束,限制了数据的范围和格式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • MySQL触发器自动智能化的数据维护

    MySQL触发器自动智能化的数据维护

    这篇文章主要介绍了MySQL触发器自动智能化的数据维护,触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段
    2022-07-07
  • SQL中MIN和MAX及常见函数教程示例

    SQL中MIN和MAX及常见函数教程示例

    这篇文章主要为大家介绍了SQL中MIN和MAX及常见函数教程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • navicat连接mysql报错10060的解决办法

    navicat连接mysql报错10060的解决办法

    最近在学习中遇到了个小问题,现在将解决的办法分享给同样遇到这个问题的同学,这篇文章主要给大家介绍了关于navicat连接mysql报错10060的解决办法,需要的朋友可以参考下
    2023-03-03
  • DDL数据库与表的创建和管理深入讲解使用教程

    DDL数据库与表的创建和管理深入讲解使用教程

    这篇文章主要介绍了DDL数据库与表的创建和管理,系统架构的层面来看,数据库从大到小依次是数据库服务器(上面安装了DBMS和数据库)、数据库(也称database或者schema)、数据表、数据表的行与列
    2023-04-04
  • 用批处理实现自动备份和清理mysql数据库的代码

    用批处理实现自动备份和清理mysql数据库的代码

    有网友问我在win2003下如何自动备份MySQL数据库,既然是自动备份,那肯定得写脚本,当然我们也可以利用软件实现
    2013-08-08
  • MySQL分区表的详细介绍

    MySQL分区表的详细介绍

    当设计MySQL分区表时,需要考虑以下几个方面,分区策略、分区字段、分区数量和分区函数,本文就来介绍一下MySQL分区表,感兴趣的可以了解一下
    2023-10-10
  • 浅谈为什么MySQL不建议delete删除数据

    浅谈为什么MySQL不建议delete删除数据

    这篇文章主要介绍了浅谈为什么MySQL不建议delete删除数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Win2003服务器安装及设置教程 MySQL安全设置图文教程

    Win2003服务器安装及设置教程 MySQL安全设置图文教程

    Win2003服务器安装及设置教程,一般脚本之家为客户都是将MySQL运行于普通用户下,这样才会尽量避免提权,新建用户什么的
    2012-05-05

最新评论