mysql 报错解决思考Expression #5 of SELECT list is not in GROUP BY clause and contains nonaggregated column

mysql报错:

[Err] 1055 - Expression #5 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘库名.表名.字段’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

分析

发生这个错误,一般是sql不规范,出现类似下列写法导致的:
select a字段,b字段 from 表 group by b字段

可以看到,明明按照b字段分组的,却想查出a字段,当然,mysql5.7.5版本之前,由于没有对这种做严格校验,所以如果刚好每组b字段都有相同的a字段,也是能查出来的,所以给了很多人一个错觉,就是觉得这样写也是没问题的,包括我之前也是这样认为的,汗颜。

但今天发现这个问题,却发现网友给出的解决方案,更是粗糙的不行。
一般网上搜到的解决方案是:

不启用ONLY_FULL_GROUP_BY,也就是不检测这种功能依赖关系,然后让你执行这个语句:
select @@global.sql_mode;
查出有ONLY_FULL_GROUP_BY,然后让你把ONLY_FULL_GROUP_BY删掉,再把剩下的值set进去,比如:
set @@global.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
更有甚者,直接让你set一个空,合着把所有的检测这种都给关了:
set @@global.sql_mode=''; 
比如这个文章就是这么给的解决方案(这个还稍微好点,不是直接set空的):
https://blog.csdn.net/qq_34707744/article/details/78031413(并不是针对这个,相同解决方案的文章很多,也不知道谁抄的谁)

这样搞问题确实也解决了,但治标不治本。

正确的解决方案,应该是优化你的sql,因为sql规范中确实明确指出,用了group by后,select后的字段,只能是group by的字段,或者一些聚集函数,比如sum(a字段)这种。
查看sql92规范中,人家确实也明确指出针对group by的规范,如下:
sql相关group by规范的链接:http://dev.cs.ovgu.de/db/sybase9/help/dbugen9/00000284.htm
截图如下:
在这里插入图片描述

大概意思是:

用于GROUP BYSQL / 92标准要求满足以下条件:SELECT子句的表达式中使用的列必须在GROUP BY子句中。否则,使用该列的表达式是一个聚合函数。GROUP BY表达式只能包含选择列表中的列名,而不能仅用作向量聚合的参数。

解决

所以,针对上面这个不规范sql,应该改成:
select a字段,b字段 from 表 group by a字段,b字段;
而且最好ab字段是索引,当然这是group by的优化部分了,不多说了。

反思

这个问题,说实话我以前也没太注意,确实也是之前用的都是mysql5.7.5版本之前的低版本,也一直不报错,所以慢慢的惯出坏习惯了,不认为这是个问题。其实这个问题,也是我的一个很有资历的同事给我指出的,在此感谢他。
最近由于刚刚换了mysql8高版本版本,也是各种被教育,但我觉得是好事,版本在升级,人也要跟着进步。
绝对不能学习很多网友的那个解决方案,人家高版本专门把这个检测功能依赖关系加上了,你再手动关掉,那还不如直接用低版本算了。

不过网友的这种想法,有时候想想也能理解一点。因为在软件行业,干久了就会有一个思维,就是如果一个问题没办法正面解决,那就想办法绕过他,只要最终目的达到就行了。
比如高并发的这些问题,io的这些问题,确实因为现有技术原因解决不了,所以我们都会选择绕过正面去解决,比如通过加机器来提高系统并发等。
所以说,有这种绕过的思维是好的,但不能养成稍微一不会就想着怎么绕过,我们还是要对技术有最基本的探索精神的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

报表设计调研分享

公司结算系统要做一个内部报表,想自己开发,调研了市面上一圈报表,快把github翻烂了,也没找到一个合适的。 之前给做过一个自定义sql查询的,但最终是因为系统太过复杂,导致最终sql复杂到没法写了&#xff0c…

java 调用groovy脚本,实现多个sql按指定逻辑运行,可做报表预聚合

java 调用groovy脚本&#xff0c;实现多个sql按指定逻辑运行&#xff0c;可做报表预聚合 1、引入pom <dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy</artifactId><version>2.1.6</version></dependenc…

互联网技术部门该如何管理

互联网技术部门该如何管理 一、敏捷开发 1.快速开发、快速迭代。 2.组件式开发&#xff0c;避免重复造轮子。 3.制定代码标准。 4.并行开发&#xff0c;高效配合。 5.单元测试必须覆盖所有核心业务。 二、DevOps流程建立起来 1.建立三套环境&#xff1a;测试、SandBox、…

分布式基础

四大基础理论 拜占庭将军问题 CAP 理论 为什么CAP不能同时满足的简单理解 ACID 理论 BASE 理论 八大分布式协议和算法 Paxos 算法 Raft 算法 [分布式一致性协议] ------ raft协议的解释与理解 一致性 Hash 算法 hash和一致性hash Gossip 协议算法 Quorum NWR 算法…

java file.renameTo返回false的原因记录

需要对文件夹下的文件重命名&#xff0c;发现返回false了&#xff0c;先用main方法测试&#xff0c;发现没问题&#xff0c;如下 public static void main(String[] args) throws IOException {File file1 new File("D:\\aabb.xml");File file2 new File("D:\…

若依前后分离项目,发布在阿里云效中

后端服务 配置代码源 配置构建信息 mvn -B clean package -pl ruoyi-admin -am -Dmaven.test.skip=true -Dautoconfig.skip 项目名称和pom文件中保持一致,都叫ruoyi-admin

mysql 使用id in(‘1,2‘) 的时候,只能查到id=1的数据的解决方法

mysql 使用id in(‘1,2’) 的时候&#xff0c;只能查到id1的数据的解决方法 前提&#xff1a; t_user表有两条数据&#xff0c;id分别是1和2 场景1 查询&#xff1a;select * from t_user where id in(1,2) 结果&#xff1a;两条数据 正常 场景2 查询&#xff1a;select …

JVM基础知识汇总

1.jvm是什么 Java Virtual Machine&#xff08;Java虚拟机&#xff09;,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. 本文jvm是基于jdk7写的,关于jdk8的jvm,和jdk7的稍有不同,详见文章末尾链接 2.jvm能做什么 java语言之所以可以跨平台,就…

java程序员常用查询和学习的网站

常用的一些程序员相关网站,在这里记录下,大家一起学习 置顶&#xff1a; 唯品会java开发手册&#xff08;基于阿里巴巴java开发手册&#xff09; pdf转word&#xff08;推荐用这个&#xff0c;国外的&#xff09; pdf转word&#xff08;国内的这个有大小限制&#xff09; 1.生成…

Longest Palindromic Substring Part II

Longest Palindromic Substring Part II 给定一个字符串 S, 找出字符串S中的最长回文子字符串. 注意: 这是关于:Longest Palindromic Substring.的第二篇文章了.在这里,我们讨论一种可以再线性时间内找到字符串中最长回文子字符串的一种算法(Manacher’s algorithm).请先阅读第…

Java反射基础(一)--Class对象获取

Classes Java中,任何一个对象要么是一个引用类型要么是基本数据类型.引用类型指的是那些直接或间接 Java.lang.Object的类.Classse,enum,和接口都是应用类型.基本类型是一个固定的集合,它包括: boolean, byte,short, int, long,char,float, double. java.lang.String和所有的基…

Java反射基础(二)--Fileds对象的使用

在说Filed之前,我们先来了解一下Member接口. 反射中定义了一个接口 java.lang.reflect.Member . java.lang.reflect.Field, java.lang.reflect.Method, 和java.lang.reflect.Constructor 都实现了该接口.我们将在接下来的部分介绍这些类.对于每个Member, 我们都会介绍相关的API…

Java反射基础(三)--Methods对象的使用

Method 原文地址:http://docs.oracle.com/javase/tutorial/reflect/member/method.html 1.获得方法类型信息 一个方法的声明包括方法名,修饰符, 参数, 和返回类型,同时还有一些方法可能抛出的异常. 类 java.lang.reflect.Method 提供了一种方式让我们可以得到方法的这些信息. …

Guice基本用法

本文适合对依赖注入有相对了解的读者&#xff0c;文章中对于部分名词未作详细解释。对于没有恰当的中文与之对应的英文内容&#xff0c;遂未翻译 Guice简介 Guice 简介&#xff0c;本文中的内容也是参考该文档完成&#xff0c;如有不一致&#xff0c;以该文为准。 快速上手 …

Guice之Servlet基础

如果读者对于Guice没有大体的了解&#xff0c;可以参考本人的另一篇Guice基础文章 Guice 提供了一个完整的体系使得我们在web应用中也可以使用它作为依赖注入的工具. 为什么使用 Guice : 使用Guice的好处: 构造函数注入类型安全的, 方便的配置方式(只需要在web.xml中进行很…

矩阵 I : 矩阵基础

学习机器学习, 基础的线性代数知识是必备的基础功, 对于线性代数的探索, 矩阵是线性代数的主要研究对象. 今天我们就开始学习一下矩阵的基础知识. 这是本人关于线性代数矩阵的第一篇分享. 章节目录 矩阵及其基本运算 1.1 矩阵定义 1.2 矩阵基本运算(,-,*) 1.3 转置矩阵 1…

矩阵 II : 线性组的线性相关性

学习机器学习, 基础的线性代数知识是必备的基础功, 对于线性代数的探索, 向量组也是线性代数的重要基础. 今天我们就开始学习一下线性代数中重要的向量组知识. 这是本人关于线性组的线性相关性的学习分享. 章节目录 相关性基本概念 1.1 相性相关和线性无关 1.2 相性相关性的…

汇编语言笔记(一):基础

章节目录 简单程序 使用段简单字符串处理程序使用 bx, si, di, bp 寄存器寻址寻址方法指明数据长度div指令 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 本文中所有程序均在DOSBox下使用MASM, LINK编译运…

汇编学习笔记(二):转移指令

章节目录 转移指令原理 jmp 指令 jcxz 指令 loop 指令 ret 和 retf 指令 call 指令 callret 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 本文中所有程序均在DOSBox下使用MASM, LINK编译运行 转移指令…

汇编语言笔记(三): 标志寄存器

章节目录 简介 ZF 标志寄存器PF 标志寄存器SF 标志寄存器CF 标志寄存器OF 标志寄存器几条相关指令DF 标志寄存器PUSHF and POPF 标志寄存器 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 简介 8086 CPU…