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

【MySQL 的 ONLY_FULL_GROUP_BY 模式】

引言:
作为一个菜鸟,当写sql中涉及到group by这样简单的语句时,也会出现问题,我在牛客网上做sql题时,总报这个错:
ONLY_FULL_GROUP_BY到底是什么东西呢?

今天写篇文章解释一下。

一、GROUP BY使用时的关键要点

1.理解GROUP BY的作用

GROUP BY用于将数据集分割成多个组,每个组由一组具有相同属性的行组成。这使得聚合函数可以应用于每一组,而不是整个数据集。例如,使用GROUP BY可以按产品类别统计销售总额。

2.遵守ONLY_FULL_GROUP_BY规则

在 MySQL 中,如果启用了ONLY_FULL_GROUP_BY模式,那么SELECT子句中除聚合函数之外的所有列都必须在GROUP BY子句中出现。这是为了避免不确定性和潜在的数据歧义。

3.使用HAVING进行条件过滤

HAVING子句用于对分组后的结果进行过滤,类似于WHERE子句,但HAVING适用于聚合结果。例如,你可以使用HAVING COUNT(*) > 1来找出至少出现两次的组。

4.正确排序结果

虽然GROUP BY自身不会自动排序结果,但你通常会希望在结果集中应用ORDER BY来排序分组。例如,你可以按销售额降序排序产品类别。

5.注意空值和 NULL 值

GROUP BY中,NULL 值会被视为相同的值,这意味着所有包含 NULL 的行会被归入同一组。如果需要区分 NULL 和非 NULL 值,可以使用COALESCE()或者条件表达式。

二、ONLY_FULL_GROUP_BY规则

1. 什么是 ONLY_FULL_GROUP_BY?

ONLY_FULL_GROUP_BY是 MySQL 中的一个 SQL 模式,它要求在任何包含聚合函数的查询中,所有在SELECT子句中出现的非聚合列也必须在GROUP BY子句中出现。换句话说,如果一个查询使用了聚合函数,那么除了聚合函数包裹的列以外,所有在SELECT子句中出现的列都必须被GROUP BY子句引用。

这个规则确保了查询结果的确定性和一致性,避免了由于 SQL 语句的模糊性而导致的潜在错误。

2. 为什么需要 ONLY_FULL_GROUP_BY?

ONLY_FULL_GROUP_BY被引入之前,MySQL 允许在没有GROUP BY或者GROUP BY不充分的情况下进行查询。这意味着,即使查询中包含了没有被聚合的列,MySQL 也会返回任意一个结果,这可能会导致误导性的结果或数据丢失。

例如,假设我们有以下查询:

SELECT prod_name, COUNT(order_num) FROM products p JOIN orders o ON p.prod_id = o.prod_id;

这里,prod_name列没有被聚合函数包裹,也没有在GROUP BY子句中出现。在ONLY_FULL_GROUP_BY模式下,这个查询会失败,因为 MySQL 不知道如何从多个可能的prod_name值中选择一个来展示。

3.如何启用或禁用 ONLY_FULL_GROUP_BY?

在 MySQL 中,默认情况下ONLY_FULL_GROUP_BY是启用的。你可以通过检查@@sql_mode系统变量来确认这一点:

SELECT @@sql_mode;

如果ONLY_FULL_GROUP_BY已经被启用,并且你想要暂时禁用它(尽管这不是一个推荐的长期解决方案),你可以通过以下命令在会话级禁用它:

SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

或者,你也可以在 MySQL 配置文件(my.cnf 或 my.ini)中修改sql_mode设置来全局禁用它。

总结

虽然禁用ONLY_FULL_GROUP_BY可能会方便一些查询的编写,但从长远来看,遵循这个规则对于保持数据查询的准确性和一致性至关重要。在编写 SQL 查询时,始终应确保遵循ONLY_FULL_GROUP_BY的指导原则,以避免潜在的数据解释错误。


http://www.jsqmd.com/news/487148/

相关文章:

  • 基于微信小程序的药店商城管理系统Python-flask
  • YOLO11 改进 - 主干网络_ 清华大学CloFormer AttnConv :利用共享权重和上下文感知权重增强局部感知,注意力机制与卷积的完美融合
  • 简单工厂模式和策略模式的区别
  • YOLO11 改进 - 主干网络_ RepViT重访移动端CNN的ViT视角:轻量级设计分离Token与Channel混合器,优化移动端实时检测
  • python 生成与安装 inquirement
  • 探索MATLAB下综合能源系统优化调度:阶梯式碳与供需灵活双响应的奇妙之旅
  • 轻松掌握C语言中的大小写字母转换
  • YOLO11 改进 - 主干网络_ SwinTransformer 移位窗口层次化视觉变换器:层次化特征提取增强多尺度目标感知,优化复杂场景检测
  • 新手也能上手!备受喜爱的降AI率工具 —— 千笔·降AI率助手
  • 【Azure Key Vault】下载Key Vault中保存证书的PFX文件报错问题分析
  • 空间栅格化(体素化)及射线选择原理
  • 【2026年最新600套毕设项目分享】springboot房屋交易系统(14149)
  • **发散创新:基于Python的脉冲神经网络模拟与实时计算优化实践**
  • 爱心捐赠系统,公益捐赠系统, 基于SpringBoot3+vue3的原创精品,适用于毕业设计、实习项目、学习项目
  • YOLO11 改进 - 主干网络_ FasterNet (基于PConv部分卷积的神经网络):轻量级设计优化内存访问效率,实现精度与速度双重提升
  • YOLOv11涨点改进| CVPR2026 |全网创新首发、Conv卷积改进篇 | 引入MSInit轻量级多尺度卷积,捕获局部细节和结构纹理信息,助力YOLOv11目标检测,图像分割,图像分类高效涨点
  • # 虚拟世界中的编程艺术:用 Rust构建轻量级 3D 场景引擎 在虚拟世界的浪潮中,**开发
  • 前端如何渲染 Markdown 格式:从基础到实战全指南
  • 快捷键及Dos命令
  • YOLO11 改进 - 主干网络_ MobileNetV4 移动网络第四版:通用倒瓶颈与移动注意力协同优化硬件效率,提升移动端检测适应性
  • H6光伏逆变器仿真模型:与量产程序一致的代码控制探索
  • YOLO11 改进 - 主干网络_ LSKNet大型选择性核网络:大核深度卷积与空间选择机制协同动态调整感受野,增强旋转目标检测
  • 大数据与会计专业必考证书有哪些?
  • 如何基于页面设计测试点(测试实习经验总结)
  • YOLO11 改进 - 主干网络_ EfficientRep:一种旨在提高硬件效率的RepVGG风格卷积神经网络架构
  • 飞桨动态图超流畅
  • 财务BP
  • 基于微信小程序的竞赛报名系统_13348
  • 青龙面板密码和账户错误重置
  • 基于 MATLAB 的改进带记忆模拟退火算法求解 TSP 问题