MySQL报错:sql_mode=only_full_group_by的4种轻松解决方法(含举例)

 更新时间:2023年01月12日 11:15:13   作者:兔霸哥S  
今天学mysql函数的时候在自己服务器上的MySQL碰见了个奇怪的问题,下面这篇文章主要给大家介绍了关于MySQL报错:sql_mode=only_full_group_by的4种轻松解决方法,需要的朋友可以参考下

前言​

作为初学者,我们在使用MySQL的时候总是会遇到各种各样的报错,让人头痛不已。其中有一种报错,sql_mode=only_full_group_by,十分常见,每次都是老长的一串出现,然后带走你所有的好心情

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

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

select Beijing,Shanghai from city group by Beijing

​如果改成这个样子:

select Beijing,Shanghai from city group by Beijing,Shanghai

或者这个样子:

select Beijing from city group by Beijing

就不会报错了。

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

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

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

首先,打开数据库,输入

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 Beijing,any_value(Shanghai) from city group by Beijing

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

select Beijing,group_concat(Shanghai) from city group by Beijing

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

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

https://www.nowcoder.com/practice/4a052e3e1df5435880d4353eb18a91c6?tpId=82&tqId=29764&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3DSQL%25E7%25AF%2587%26topicId%3D82&difficulty=undefined&judgeStatus=undefined&tags=&title=

题目如下:

如果我们不用上面的方法,直接用下面这种方式查询,很明显会出现 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报错:sql_mode=only_full_group_by的4种轻松解决方法的文章就介绍到这了,更多相关MySQL报错sql_mode=only_full_group_by内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • VS2022连接数据库MySQL并进行基本的表的操作指南

    VS2022连接数据库MySQL并进行基本的表的操作指南

    鉴于MySQL数据库的流行与强大,决定多学习使用,下面这篇文章主要给大家介绍了关于VS2022连接数据库MySQL并进行基本的表的操作指南,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • mysql重复索引与冗余索引实例分析

    mysql重复索引与冗余索引实例分析

    这篇文章主要介绍了mysql重复索引与冗余索引,简单说明了重复索引与冗余索引的概念、应用场景并结合实例形式分析了mysql重复索引与冗余索引相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • MySQL索引与事务定义到使用详解

    MySQL索引与事务定义到使用详解

    这篇文章主要介绍了MySQL数据库索引事务,索引是为了加速对表中数据行的检索而创建的一种分散的存储结;事物是属于计算机中一个很广泛的概念,一般是指要做的或所做的事情,下面我们就一起进入文章了解具体内容吧
    2022-12-12
  • MySQL为例讲解JDBC数据库连接步骤

    MySQL为例讲解JDBC数据库连接步骤

    这篇文章主要为大家详细介绍了MySQL为例讲解JDBC数据库连接步骤,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 数据库Sql实现截取时间段和日期实例(SQL时间截取)

    数据库Sql实现截取时间段和日期实例(SQL时间截取)

    在许多情况下你也许只想得到日期和时间的一部分,而不是完整的日期和时间,下面这篇文章主要给大家介绍了关于数据库Sql实现截取时间段和日期(SQL时间截取)的相关资料,需要的朋友可以参考下
    2023-05-05
  • 详解MySQL中EXPLAIN解释命令及用法讲解

    详解MySQL中EXPLAIN解释命令及用法讲解

    explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句
    2017-11-11
  • 在OneProxy的基础上实行MySQL读写分离与负载均衡

    在OneProxy的基础上实行MySQL读写分离与负载均衡

    基于Libevent机制实现,单个实例可以实现25万的SQL转发能力,用一个OneProxy节点可以带动整个MySQL集群,为业务发展贡献一份力量,下面由小编来为大家简单说说
    2019-05-05
  • MySQL五步走JDBC编程全解读

    MySQL五步走JDBC编程全解读

    JDBC是指Java数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库。从根本上来说,JDBC 是一种规范,它提供了一套完整的接口,允许便携式访问到底层数据库,本篇文章我们来了解MySQL连接JDBC的五步走流程方法
    2022-01-01
  • MySQL中如何增加字段SQL语句

    MySQL中如何增加字段SQL语句

    这篇文章主要介绍了MySQL中如何增加字段SQL语句问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • mysql 5.7.17 免安装版配置方法图文教程(windows10)

    mysql 5.7.17 免安装版配置方法图文教程(windows10)

    这篇文章主要为大家详细介绍了windows10下mysql 5.7.17 免安装版配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01

最新评论