MySQL报错:sql_mode=only_full_group_by 4种解决方法含举例,轻松解决ONLY_FULL_GROUP_BY的报错问题

这篇具有很好参考价值的文章主要介绍了MySQL报错:sql_mode=only_full_group_by 4种解决方法含举例,轻松解决ONLY_FULL_GROUP_BY的报错问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


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

​​sql_mode=only_full_group_by,SQL,mysql,sql,数据库

出现这样的报错,并不是因为你的代码写得不好,而是因为在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():将分到同一组的数据默认用逗号隔开作为返回数据

sql_mode=only_full_group_by,SQL,mysql,sql,数据库

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=

题目如下:

sql_mode=only_full_group_by,SQL,mysql,sql,数据库

  1. 如果我们不用上面的方法,直接用下面这种方式查询,很明显会出现 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
  1. 我们可以换一种思路:首先查询得到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

当然,具体问题,具体对待。遇到相差比较大的问题,就需要换一种查询方式了。
如果需要练习此题,可以点击文中代码直接进入牛客,或者在评论区找到创建该题目的代码,在电脑中运行,试一试,有没有其他更巧妙的办法解决这道题。文章来源地址https://www.toymoban.com/news/detail-836021.html

到了这里,关于MySQL报错:sql_mode=only_full_group_by 4种解决方法含举例,轻松解决ONLY_FULL_GROUP_BY的报错问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL运维实战(4.3) SQL_MODE之ONLY_FULL_GROUP_BY

    作者:俊达 设置ONLY_FULL_GROUP_BY时,对有GROUP BY子句SQL,SELECT的字段要么是GROUP BY中的字段,要么对字段进行聚合运算(如 SUM、COUNT 等),否则SQL执行报错。 不设置ONLY_FULL_GROUP_BY则允许更宽松的行为,即使查询违反了这一规则,MySQL 也会接受,即对于不在GROUP BY字段,不使用聚

    2024年01月19日
    浏览(66)
  • mysql 8.0 找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案

    sql_mode=only_full_group_by问题产生原因:MySQL 5.7.5及以上功能依赖检测功能。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们。 1、navcat中新建查询: select @@

    2024年01月23日
    浏览(51)
  • this is incompatible with sql_mode=only_full_group_by

    查看配置 select @@global.sql_mode 在sql命令行中输入select @@sql_mode 能够看到sql_mode配置,如果有ONLY_FULL_GROUP_BY,则需要修改 在mysql5.7.5后,ONLY_FULL_GROUP_BY是默认选项,所以就会导致group by的问题 set sql_mode=‘复制去掉ONLY_FULL_GROUP_BY’; 当然这样处理也只是暂时的,要想永久的处理还得去

    2024年02月15日
    浏览(46)
  • SQL语句错误this is incompatible with sql_mode=only_full_group_by解决方法

    一、原理层面 这个错误发生在mysql 5.7.5 版本及以上版本会出现的问题: mysql 5.7.5版本以上默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了\\\"SQL92标准\\\"。 很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。

    2024年01月21日
    浏览(47)
  • 解决MySQL-this is incompatible with sql_mode=only_full_group_by 问题(提供window、Linux、docker解决方法和流程)

    出现这个问题是因为,对于GROUP BY操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。 也就是说如果我分组查询,比如我表里有三个字段 id、name、type,我根据type分组查询,那么结果集里就不能包含name字段。 要想解决这个问题

    2024年02月04日
    浏览(49)
  • mysql sql_mode数据验证检查

    sql_mode 功能 sql_mode 会影响MySQL支持的sql语法以及执行的 数据验证检查 。通过设置sql_mode ,可以完成不同严格程度的数据校验,有效地保障数据准确性 sql_mode 严格模式 VS 宽松模式 宽松模式 比如,插入的数据不满足 表的数据类型,也可能接受,并且不报错,只会有警告而且。

    2024年02月10日
    浏览(45)
  • MySQL运维实战(4.2) 关于SQL_MODE

    作者:俊达 早期,MySQL对一些不符合SQL标准的SQL语句和数据的容忍度比较高,可能会自主地执行或转换一些语句。但是,随着MySQL 5.7的推出,对默认的SQL模式进行了修改,更加强调SQL的合规性,这种变化是为了提高数据一致性和统一SQL标准。系统在升级MySQL版本时,特别是从

    2024年01月17日
    浏览(57)
  • 关系数据库-9-[mysql8]中的语法校验规则sql_mode应用

    Mysql中sql_mode使用详解 sql_mode是一组mysql的语法校验规则,定义了mysql应该支持的sql语法、数据校验等。 1.3.1 ANSI模式 这是一种宽松模式,该模式下,会对所操作数据进行校验,如果不符合校验规则,数据会按照规则执行,并报warning警告。 1.3.2 STRICT_TRANS_TABLES模式 这是一种严格

    2024年02月02日
    浏览(48)
  • MySQL运维实战(4.6) SQL_MODE之NO_BACKSLASH_ESCAPES

    作者:俊达 在MySQL中,默认情况下,反斜杠()被用作转义字符,转义反斜杠()后一个字符;当设置NO_BACKSLASH_ESCAPES后,反斜杠()将不作为转义字符,而被视为普通字符。 下面是一个示例,说明了这两种情况的区别: 未设置NO_BACKSLASH_ESCAPES模式 设置NO_BACKSLASH_ESCAPES 总之,N

    2024年01月23日
    浏览(57)
  • MySQL运维实战(4.4) SQL_MODE之STRICT_TRANS_TABLES和STRICT_ALL_TABLES

    作者:俊达 在MySQL中,STRICT模式主要用于控制数据库的行为,有助于保持数据的一致性和完整性,特别是在涉及到数据写入、更新和其他操作时的约束。 如果设置STRICT模式,MySQL会更加严格地执行数据写入和更新等操作,当数据不符合字段定义或者违反了约束条件,MySQL将抛

    2024年01月18日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包