MySQL:关于group by的一个小坑,以及sql_mode=only_full_group_by问题

news2024/12/22 21:05:48

先来说一下:sql_mode=only_full_group_by这个报错

        我们公司的一个项目在我部署的时候,出现了这样一个问题,就是上面这个报错,他的原因也非常简单,我们在开发的时候mysql是5.5版本,线上是5.7版本,而5.7以及8的版本都具有设置ONLY_FULL_GROUP_BY时,对有GROUP BY子句SQL,SELECT的字段要么是GROUP BY中的字段,要么对字段进行聚合运算。

所以例如:

select product_id,min(`year`),quantity,price from sales
GROUP BY product_id

        你这么写,除了前两个字段以外,quantity和price都会报这个问题,这个严格模式有的时候我们是要取消掉的,但是如果取消掉其实会有很多的问题,我们下面再讲,先来讲讲如何取消掉。

一、取消严格模式      

原理很简单,找到你mysql的ini文件(我是windows,Linux的可以去别的文章搜一搜,都有);
我的位置是:C:\ProgramData\MySQL\MySQL Server 5.7 (其实网上有很多找my.ini的方法一搜就是,我这里不多赘述了);
然后打开ini,里面你在mysqlid下面能找到;

把only_full_group_by删除即可,然后保存重启mysql服务,这个严格模式就关掉了。 

 二、group by的一些小坑(很重要建议看一下)

现在已经关闭掉了严格模式,然后我们看一个问题,这个还是很久之前我做leetcode的时候碰到过的一个问题,我们先看数据。这是一张表,要求查相同product_id下第一年的销售情况 。

诶,有的老哥看到这就想,这也太简单了吧?直接根据product_id分组后select min(year)不就完事了吗?我们看SQL和结果:

是的,我当时也是非常的自信,三下五除二就写完了,发现不对!!! 为什么2007年的销售情况是10和5000?不应该是8和3000吗? 

这就是取消了严格查询的后果,group by分组后,如果查询的字段不是分组或者聚合后的字段他是会返回这个分组字段的第一条信息的,而第一条信息是2008年的10和5000,这就是group by的一个小坑。

所以才有了严格模式,对有GROUP BY子句SQL,SELECT的字段要么是GROUP BY中的字段,要么对字段进行聚合运算,这才不会有这样的问题,所以各位在写group by的时候一定要看仔细了。 

然后说一下正确的答案:

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

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

相关文章

又一款接私活神器!基于 SpringBoot + Bootstrap 的极速后台开发框架,牛到不行!【免费领】

推荐一个后台管理系统。功能完整,代码结构清晰。值得推荐。 项目介绍 本项目系统是一款基于 SpringBoot Bootstrap 的极速后台开发框架,可以用于所有的 Web 应用程序,易读易懂。RuoYi 支持集群,支持多数据源,支持分…

电脑开机后卡在开机LOGO画面如何排查处理

当电脑开机后长时间停滞在开机LOGO画面,无法继续进入操作系统,这一现象常令用户困扰不已。本文将深入探讨导致此类问题的多种可能原因,并提供相应的解决方法,帮助你有效地诊断和排除故障。 硬件故障或接触不良 1. 硬盘问题:硬盘是系统启动的关键组件,其故障或数据线接触…

免费调用阿里云通义千问(qwen-1.8b-chat)大模型API

目录 前言通义千问开通注意 APi接口最后 前言 免费的GPT接口国内的使用一段实践就会失效,阿里云的qwen-1.8b-chat限时免费,可对接!目前本账号小助手也是对接了该模型 通义千问 通义千问,是基于阿里巴巴达摩院在自然语言处理领域…

Mac安装telnet

一、安装Homebrew 1、打开官网:Homebrew — The Missing Package Manager for macOS (or Linux) 2、打开终端输入: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 二、安装Telnet bre…

日本宇宙航空研究“Int-Ball2”自由飞行相机机器人采用的Epson IMU

IMU有助于飞行的稳定控制和电池充电的自动对接- 精工爱普生公司(TSE:6724,“Epson”)很高兴地宣布,日本宇宙航空研究开发机构(JAXA)选择了爱普生M-G370系列的惯性测量单元(IMU)&…

【单链表专题】

单链表专题 1.引入2.链表2.1链表的关系2.2链表的结构 3.代码实现链表 1.引入 对于顺序表而言 中间/头部的插⼊删除,时间复杂度为O(N)增容需要申请新空间,拷⻉数据,释放旧空间。会有不小的消耗。增容⼀般是呈2倍的增⻓,势必会有⼀…

学习100个Unity Shader (15) ---透明+双面渲染

文章目录 效果shader理解参考 效果 shader Shader "Example/AlphaBlendBothSided" {Properties{_Color ("Main Tint", Color) (1, 1, 1, 1)_MainTex ("Texture", 2D) "white" {}_AlphaScale ("Alpha Scale", Range(0, 1)…

XYCTF-部分web总结

这个月在XYCTF中写了部分web题,题中学到在此记录一下 ezhttp 打开就是一个简单的登录页面 f12说藏在一个地方,先想到的就是robots.txt 访问直接给账号密码 username: XYCTF password: JOILha!wuigqi123$登录后: 明显考源跳转,修改referer值…

window 安装大模型 chatglm.cpp

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

【MyBatis】使用MyBatis框架在两张表是一对多的情况下,进行分步查询,发现对查询出来的结果进行封装时没有将实体类的id进行赋值

Catalog MyBatis在两张表是一对多的情况下,进行分步查询,发现对查询出来的结果进行封装时没有将实体类的id进行赋值1. 表结构2. 场景3. 实现方式具体步骤 4 .测试5. 解决方法 MyBatis在两张表是一对多的情况下,进行分步查询,发现对查询出来的结果进行封装…

【顺序表小题】

顺序表小题 移除元素思路一思路二 合并两个有序数组思路一思路二 移除元素 链接: 题目链接 思路一 创建新的数组,遍历原数组,将不为val的值放到新数组中 思路二 双指针法。 创建两个变量src,dst。 1)若src指向的值为val,则src 2)若sr…

堆的介绍,实现(c语言实现)

目录 堆的概念 堆的性质: 堆的分类 父子结点的下标关系 堆的向下调整算法 ​编辑小堆 大堆 建堆 堆的向上调整算法 小堆 大堆 堆的基本操作 定义堆 初始化堆 销毁堆 打印堆 堆的插入 堆的删除 大堆(Max Heap)的向下调整算法…

51单片机入门(一)

1. 51单片机的基础介绍 2. RAM和ROM的区别 总体而言,RAM和ROM在计算机系统中起着不同的角色,RAM用于临时存储运行时数据,而ROM用于存储永久性的固件和系统程序。 3. 为什么叫51单片机 因为51系列单片机都是使用Intel 8031指令系统的单片机…

[linux网络编程]UDP协议和TCP协议的使用

目录 看以下内容前,你要先了解main函数带参数有什么用、 了解socket的相关函数接口 如果不了解socket的相关函数接口请先看我这篇文章 main函数带参数有什么用 UDP udp_server 1.生成socket文件描述符 2.填充sockaddr_in信息 3.bind 4.发(收&…

Golang基础7-并发编程

并发编程 https://www.cnblogs.com/Survivalist/p/11527949.html 进程和线程、协程的区别_线程协程进程的区别-CSDN博客 Golang中的并发编程是一个重点,我们要了解Golang中的并发Goroutine因此需要先理解进程、线程、之后再理解协程。 进程:操作系统进…

论文发表英语类期刊《校园英语》如何投稿?

论文发表英语类期刊《校园英语》如何投稿? 《校园英语》本刊设有栏目:本期关注、教研探索、实践前沿、经验交流、翻译探究、语言文化等。 《校园英语》杂志是经国家新闻出版总署批准,创刊于2000年,由河北出版传媒集团主管&#…

AI文章写作网站

最强AI文章写作网站——心语流光( Super Ai Writer ) 特点 多轮问答写作,自动携带历史记录进行问答可以自定义携带历史记录的轮数,为0则携带全部历史记录,有效避免token浪费(类似coze平台)AI生…

制作自己的YOLOv8数据集

制作自己的YOLO8数据集 前言 该数据集的格式参照于coco数据集结构✨ 步骤一:收集图像数据 从互联网上下载公开的数据集,也可以使用摄像头或其他设备自行采集图像,确保你的图像数据覆盖了你感兴趣的目标和场景 步骤二:安装Labe…

OCNet

object context pooling (OCP) 作者未提供代码

【黑马点评Redis——002商户查询缓存】

1. 商户查询缓存 2. 知识储备和课程内容 2.1 什么是缓存 缓存是数据交换的缓冲区,是存贮数据的临时地方,一般读写性能较高。 浏览器缓存应用层缓存数据库缓存CPU缓存磁盘缓存 缓存的作用: 降低后端负载提高读写效率,降低响应…