当前位置: 首页 > news >正文

从 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、项目订单&#xff…...

工程数学线性代数(同济第七版)附册课后习题答案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)对于电商行业的变革和意义

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/402a907e12694df5a34f8f266385f3d2.png#pic_center> 🎓作者简介:全栈领域优质创作者 🌐个人主页:百锦再新空间代码工作室 📞工作室:新空间代…...

智能病历xml提取

select * from (SELECT m.病人Id, m.主页Id, x.title, x.content.getclobval() 参考, 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&#xff1a…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

无法与IP建立连接,未能下载VSCode服务器

如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...