从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化20241112
🎯 从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化
🔎 引言
随着 MySQL 的不断升级,从 5.7 到 8.0,不仅性能得到提升,其对 SQL 标准的严格执行也显著提高。GROUP BY 的行为变化就是一个典型例子。对开发者而言,MySQL 8.0 强制遵守 ONLY_FULL_GROUP_BY 规则,虽然提高了数据一致性,但也为老代码迁移带来了不小的挑战。
本文将从 问题背景 出发,通过 报错分析 和 案例复盘,探讨如何应对 MySQL 升级带来的挑战,同时总结出一套高效的解决方案。
🌟 一、问题背景:MySQL 升级带来的挑战
1. 什么是 GROUP BY?
GROUP BY 是一种将数据按字段分组的 SQL 操作,通常用于统计、聚合和分析场景。示例如下:
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
2. MySQL 5.7 的行为
- 默认启用了 ONLY_FULL_GROUP_BY 模式,但执行较为宽松。
- 某些情况下,未完全符合规则的查询也能隐式运行。
3. MySQL 8.0 的行为
- 严格执行 ONLY_FULL_GROUP_BY 模式。
- 未分组字段或未使用聚合函数的字段会直接报错。
- 示例:
SELECT column1, column2, MAX(column3)
FROM table_name
GROUP BY column1;
在 MySQL 8.0 中,若 column2 未出现在 GROUP BY 或未使用聚合函数,将报错:
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'column2' which is not functionally dependent on columns in GROUP BY clause.
🚨 二、常见报错与原因
1. 报错示例 1
SELECT column1, column2
FROM table_name
GROUP BY column1;
- 错误信息:
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'column2'.
原因:column2 既未分组也未聚合,违反了 SQL 标准。
2. 报错示例 2
SELECT column1, MAX(column2), column3
FROM table_name
GROUP BY column1;
- 错误信息:
Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'column3'.
原因:column3 未分组或聚合,与 ONLY_FULL_GROUP_BY 规则冲突。
🔧 三、解决方案
方法 1:修改 SQL 查询 🛠️
调整查询以符合 GROUP BY 规则:
1. 所有未聚合字段必须出现在 GROUP BY 中。
2. 为未分组字段使用聚合函数。
示例改写:
-- 错误写法
SELECT column1, column2
FROM table_name
GROUP BY column1;-- 正确写法
SELECT column1, MAX(column2) AS max_column2
FROM table_name
GROUP BY column1;
- 优缺点:
• ✅ 优点:符合标准,解决问题的长远之道。
• ❌ 缺点:需要对旧代码进行大规模修改。
方法 2:调整 MySQL 配置 ⚙️
通过调整 MySQL 的 sql_mode 配置,禁用 ONLY_FULL_GROUP_BY:
步骤:
1. 检查当前 sql_mode:
SELECT @@GLOBAL.sql_mode;
输出示例:
STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY,NO_ENGINE_SUBSTITUTION
2. 移除 ONLY_FULL_GROUP_BY:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
3. 修改配置文件,永久禁用:编辑 /etc/mysql/my.cnf:
[mysqld]
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
4. 重启 MySQL 服务:
sudo systemctl restart mysql
验证:
SELECT @@GLOBAL.sql_mode;
输出中不应包含 ONLY_FULL_GROUP_BY。
优缺点:
• ✅ 优点:快速解决问题,无需修改 SQL。
• ❌ 缺点:可能导致聚合结果错误,需谨慎使用。
🔍 四、插曲:配置文件冲突与排查
1. 配置文件加载顺序
MySQL 加载配置文件的顺序如下:
1. /etc/my.cnf
2. /etc/mysql/my.cnf
3. /etc/mysql/conf.d/.cnf
4. /etc/mysql/mysql.conf.d/.cnf
- 问题:
多个配置文件中定义了 sql_mode,后加载的文件会覆盖前面的设置。
2. 如何发现冲突?
- 检查所有配置文件:
sudo grep -R "sql_mode" /etc/mysql/
- 查看实际加载的配置文件:
mysql --help | grep "Default options"
- 验证实际生效的 sql_mode:
SELECT @@GLOBAL.sql_mode;
3. 解决冲突的最佳实践
• 将主要的 sql_mode 定义放在 /etc/mysql/my.cnf。
• 针对工具(如 mysqldump)的特殊需求,单独在 /etc/mysql/conf.d/*.cnf 中配置。
📚 五、实际案例复盘
案例 1:查询菜单类型统计
表名:eb_system_menu
表结构:
+------------+--------------+
| Field | Type |
+------------+--------------+
| id | int |
| menu_type | varchar(2) |
| name | varchar(100) |
+------------+--------------+
需求:统计每种菜单类型的数量。
SELECT menu_type, COUNT(*) AS count
FROM `ydkj-mall`.`eb_system_menu`
GROUP BY menu_type;
案例 2:用户状态分布统计
表名:eb_user
表结构:
+------------+--------------+
| Field | Type |
+------------+--------------+
| uid | int |
| status | tinyint(1) |
| nickname | varchar(100) |
+------------+--------------+
需求:统计每种状态的用户数量。
SELECT status, COUNT(*) AS user_count
FROM `ydkj-mall`.`eb_user`
GROUP BY status;
🎯 六、总结与最佳实践
1. 理解 MySQL 的变化
MySQL 8.0 的严格模式符合标准化要求,虽然迁移成本较高,但能显著提高数据一致性。
2. 合理选择解决方案
- 修改 SQL 查询是最推荐的长远方案。
- 调整 sql_mode 可作为短期过渡,但需严格测试。
3. 配置管理的建议
- 集中管理 sql_mode,避免多文件冲突。
- 使用工具检查实际生效的配置,确保一致性。
🎉 附录:常用 SQL 验证命令
-- 查看当前模式
SELECT @@GLOBAL.sql_mode;-- 查看表结构
DESCRIBE `table_name`;-- 显示加载的配置文件
mysql --help | grep "Default options";
通过对 MySQL 的深入分析和实战操作,相信你已经掌握了解决 GROUP BY 规则冲突的技巧。希望这篇文章能帮助你在数据库升级中游刃有余,轻松应对变化! 😊
相关文章:
从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化20241112
🎯 从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化 🔎 引言 随着 MySQL 的不断升级,从 5.7 到 8.0,不仅性能得到提升,其对 SQL 标准的严格执行也显著提高。GROUP BY 的行为变化就是一个典型例子。…...
npm完整发包流程(亲测可验证)
1. 准备工作 (1) 在npm官网上注册一个账号 (2) 注册成功之后,npm会发送一封邮件给你,点击邮件里面的链接,做确认关联操作(必需) 2. 创建自己的npm包 (…...
学习threejs,使用JSON格式保存和加载模型
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE toJSON()方法 二、&a…...
中国首部《能源法》正式问世,它的亮点有哪些呢?
2024年11月8日,《中华人民共和国能源法》经十四届全国人大常委会第十二次会议审议通过,正式出台,将于明年1月1日起施行。 中国首部《能源法》正式问世,它的亮点有哪些呢? 一、填补立法空白,完善能源法律体…...
【外包】软件行业的原始形态,项目外包与独立开发者
【外包】互联网软件行业的原始形态,项目外包与独立开发者 本科期间写的一些东西,最近整理东西看到了,大致整理一下放出来,部分内容来自其他文章,均已引用。 文章目录 1、互联网软件行业的原始形态2、项目订单ÿ…...
工程数学线性代数(同济第七版)附册课后习题答案PDF
《线性代数附册 学习辅导与习题全解》是与同济大学数学科学学院编《工程数学 线性代数》第七版教材配套的教学辅导书,由同济大学作者团队根据教材内容和要求编写而成。本书在《工程数学 线性代数》第六版附册(即辅导书)的基础上修改而成。全书…...
【Ubuntu24.04】部署服务(基础)
目录 0 背景1 设置静态IP2 连接服务器3 部署服务3.1 安装JDK3.2 下载并安装MySQL8.43.2.1 从官网下载 APT Repository 配置文件3.2.2 安装 MySQL8.43.2.3 配置远程连接 3.3 下载并配置Redis3.4 上传jar包并部署应用3.5 开放端口 4 总结 0 背景 在成功安装了Ubuntu24.04操作系统…...
Linux符号使用记录
~ 账户 home 目录,如果是 root 账户就是 /root . 当前目录 .. 上层目录 | 管道符 & 后台工作,放在完整指令列的最后端,表示将该指令列放入后台中工作。 > 输出重定向,重新…...
初阶C++之C++入门基础
大家好!欢迎来到C篇学习,这篇文章的内容不会很难,为c的引入,c的重点内容将在第二篇的文章中讲解,届时难度会陡然上升,请做好准备! 我们先看网络上的一个梗:21天内⾃学精通C 好了&am…...
ODOO学习笔记(7):模块化架构(按需安装)
一、Odoo模块化架构概述 Odoo是一个功能强大的企业资源规划(ERP)系统,其模块化架构是它的核心优势之一。这种架构允许系统通过添加、移除或修改不同的模块来灵活地适应企业的各种业务需求。 核心模块与自定义模块: Odoo本身带有一…...
Java的dto,和多表的调用
1理论 需求是新增菜品eg:菜名:豆腐脑;口味:甜口,咸口, 菜单表:dish;口味表dish_flavor; 1dto:数据传输对象 新建一个dishDto对象有两个表里的属性 2用到两个表,dish,d…...
时序数据库TimescaleDB安装部署以及常见使用
文章目录 一、时序数据库二、TimescaleDB部署1、repository yum仓库配置2、yum在线安装3、插件配置4、TimescaleDB使用登录pg创建插件使用超表 一、时序数据库 什么是时序数据库?顾名思义,用于处理按照时间变化顺序的数据的数据库即为时序数据库&#x…...
MG算法(英文版)题解
翻译: 考虑一个加法流,其中一个特定项目出现 n^(1/2) 次,并且有 n - n^(1/2) - 1 个其他不同的项目,每个项目出现一次。在应用 Misra-Gries(MG)算法时,应该选择哪个 ε(epsilon&…...
2-UML概念模型测试
1. (单选题, 1.0 分) UML中的关系不包括()。 A. 抽象B. 实现C. 依赖D. 关联 我的答案:A正确答案: A 知识点: UML的构成 1.0分 2. (单选题, 1.0 分) 下列事物不属于UML结构事物的是()。 A. 组件B. 类C. 节点D. 状…...
人工智能(AI)对于电商行业的变革和意义
 参考, x.content content --EXTRACTVALUE(x.Content, //zlxml//document//subdoc[antetypeid"3C38A8DAB01C473A9074A8EDD0B8553"]//utext) 主治医师, --EXTRACTVALUE(x.…...
RK3568平台开发系列讲解(GPIO篇)GPIO的sysfs调试手段
🚀返回专栏总目录 文章目录 一、内核配置二、GPIO sysfs节点介绍三、命令行控制GPIO3.1、sd导出GPIO3.2、设置GPIO方向3.3、GPIO输入电平读取3.4、GPIO输出电平设置四、Linux 应用控制GPIO4.1、控制输出4.2、输入检测4.3、使用 GPIO 中断沉淀、分享、成长,让自己和他人都能有…...
使用 Web Search 插件扩展 GitHub Copilot 问答
GitHub Copilot 是一个由 GitHub 和 OpenAI 合作开发的人工智能代码提示工具。它可以根据上下文提示代码,还可以回答各种技术相关的问题。但是 Copilot 本身不能回答非技术类型的问题。为了扩展 Copilot 的功能,微软发布了一个名为 Web Search 的插件&am…...
workerman的安装与使用
webman是一款基于workerman开发的高性能HTTP服务框架。webman用于替代传统的php-fpm架构,提供超高性能可扩展的HTTP服务。你可以用webman开发网站,也可以开发HTTP接口或者微服务。 除此之外,webman还支持自定义进程,可以做worker…...
QtQuick.Controls 控件介绍(都有哪些type)
这里写目录标题 主要控件 官方示例1. quickcontrols示例示例1 控制controlsSliders滑块bottom与tab 示例2 系统对话框 systemdialogs示例3 仪表盘示例4 uiforms 表格-客户通讯录 2. quickcontrols2示例1 gallery 展示2 flat Style 扁平化 帮助文档 主要控件 Button:…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
