解决 SQL 错误 [1055]:深入理解 only_full_group_by 模式下的查询规范

在日常的 SQL 开发中,你是否遇到过这样的报错:SQL 错误 [1055] [42000]: Expression #N of SELECT list is not in GROUP BY clause and contains nonaggregated column...?尤其是在 MySQL 5.7 及以上版本中,这个错误更为常见。本文将详细解析这个错误的产生原因,并提供具体的解决方案,帮助你快速定位并解决问题。

一、错误现象与核心原因

当执行 SQL 查询时出现[1055]错误,核心原因只有一个:你的查询违反了sql_mode=only_full_group_by的约束规则。这是 MySQL 中一个重要的 SQL 模式,也是导致该错误的直接 “元凶”。

什么是 only_full_group_by?

only_full_group_by是 MySQL 的sql_mode中的一项配置,其核心作用是规范 GROUP BY 查询的语法逻辑。当启用该模式时,MySQL 强制要求:SELECT 语句中出现的所有非聚合列(未使用 SUM、COUNT、MAX 等聚合函数的列),必须全部包含在 GROUP BY 子句中

简单来说,GROUP BY 的本质是将数据按指定列分组,分组后每组只会保留一条 “代表性” 数据。如果 SELECT 中存在未在 GROUP BY 中声明的非聚合列,这些列可能在同一分组中存在多个不同值,MySQL 无法确定应该返回哪个值,因此会直接报错。

二、错误实例分析

为了更直观地理解问题,我们通过一个具体案例来拆解错误产生的过程。

场景假设

现有一张订单表orders,结构如下:

字段名

类型

说明

order_id

int

订单 ID(主键)

user_id

int

用户 ID

user_name

varchar

用户名

order_amount

decimal

订单金额

create_time

datetime

下单时间

错误查询示例

假设我们需要查询每个用户的总订单金额,编写了如下 SQL:

    SELECT user_id, user_name, SUM(order_amount) AS total_amount,create_time  -- 问题列:未在GROUP BY中,也未聚合FROM orders GROUP BY user_id;  -- 仅按user_id分组
报错原因

上述查询中,create_time是第 4 个字段(对应报错中的 “Expression #4”),它既没有出现在 GROUP BY 子句中,也没有使用聚合函数(如 MAX (create_time))。在only_full_group_by模式下,MySQL 无法确定每个用户分组应返回哪个create_time(一个用户可能有多个订单,对应多个下单时间),因此直接抛出[1055]错误。

三、解决方案

针对[1055]错误,我们有三种常见的解决思路,每种思路适用于不同场景,需根据实际需求选择。

方案 1:将非聚合列添加到 GROUP BY 子句

如果 SELECT 中的非聚合列与 GROUP BY 列存在功能依赖关系(即分组列能唯一决定非聚合列的值,如user_id唯一对应user_name),可以将非聚合列直接添加到 GROUP BY 中。

修改后的查询:

    SELECT user_id, user_name, SUM(order_amount) AS total_amount,create_timeFROM orders GROUP BY user_id, user_name, create_time;  -- 补充非聚合列到GROUP BY
方案 2:对非聚合列使用聚合函数

如果非聚合列不需要精确值,只需获取分组中的 “代表性” 数据(如最新时间、最大 ID 等),可以通过聚合函数处理。

修改后的查询:

    SELECT user_id, user_name, SUM(order_amount) AS total_amount,MAX(create_time) AS last_order_time  -- 用MAX聚合获取最新下单时间FROM orders GROUP BY user_id, user_name;  -- user_name与user_id功能依赖,需一起分组
方案 3:临时关闭 only_full_group_by 模式(不推荐)

如果暂时无法调整查询逻辑,可通过修改sql_mode关闭only_full_group_by。但这是临时解决方案,可能导致数据歧义,不建议在生产环境使用。

步骤 1:查看当前 sql_mode
SELECT @@sql_mode;

执行后会显示包含ONLY_FULL_GROUP_BY的模式列表。

步骤 2:临时关闭(重启 MySQL 后失效)
SET sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

步骤 3:永久关闭(需修改配置文件)
  1. 找到 MySQL 配置文件(Linux 通常是/etc/my.cnf,Windows 是my.ini);
  2. 在[mysqld]下添加:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
  1. 重启 MySQL 服务。

四、最佳实践

  1. 遵循 only_full_group_by 规范:这是最推荐的做法,通过调整查询逻辑(补充 GROUP BY 列或使用聚合函数)确保 SQL 符合模式要求,避免数据返回歧义。
  2. 理解功能依赖:如果非聚合列与 GROUP BY 列存在严格的一一对应关系(如user_id唯一决定user_name),将非聚合列添加到 GROUP BY 是安全且高效的。
  3. 避免随意修改 sql_mode:only_full_group_by是 MySQL 的安全机制,关闭后可能导致查询结果不可控,尤其在多人协作的项目中应谨慎操作。

总结

SQL 错误 [1055]的本质是only_full_group_by模式对 GROUP BY 查询的语法约束。解决问题的核心在于确保 SELECT 中的非聚合列全部包含在 GROUP BY 中,或通过聚合函数处理。理解这一机制不仅能解决报错,更能帮助我们写出更规范、更可靠的 SQL 查询。

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

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

相关文章

Keepalived 原理及配置(高可用)

一、Keepalived 原理keepalived 基于 VRRP(虚拟路由冗余协议)实现高可用。核心原理是通过竞选机制在多台服务器(主 / 备节点)中选举出一台主节点承担服务,同时备节点持续监控主节点状态:主节点正常时&#…

从代码混乱到井然有序:飞算JavaAI的智能治理之道

文章目录一、前言二、飞算JavaAI平台三、飞算JavaAI安装流程3.1 Idea安装配置3.2 官网注册登入四、飞算JavaAI独特魅力:合并项目场景4.1 ERP老项目精准翻新:保留核心逻辑的智能改造方案4.2 智能合并:重构ERP系统的代码迷宫4.3 ERP接口智能导航&#xff1…

iOS打开开发者模式

启用开发者模式的方法在iOS设备上启用开发者模式通常需要连接Xcode或通过设置手动开启,以下是具体步骤:通过Xcode启用将iOS设备通过USB线连接到Mac电脑。打开Xcode(需提前安装)。在Xcode的菜单栏中选择 Window > Devices and S…

leetcode101.对称二叉树树(递归练习题)

文章目录一、 题目描述二、 核心思路:判断左右子树是否互为镜像三、 递归的终止条件 (Base Cases)四、 代码实现与深度解析五、 关键点与复杂度分析六、 总结与对比 (LC100 vs LC101)LeetCode 101. 对称二叉树 - 力扣【难度:简单;通过率&…

【国内电子数据取证厂商龙信科技】谁是躲在“向日葵”后的

一、前言大家可能每天都在使用在远控软件,我们在享受远控软件带来的便利同时,犯罪者也在使用远控软件进行违法犯罪活动,以达到隐藏自己的目的。市面上常用的远控软件有“向日葵”、“TeamViewer”。二、案件背景在一次电信诈骗案件支援中&…

SAP-PP-MRPLIST

MRP(物料需求计划)分析功能,主要包含以下要点: 程序通过选择工厂和物料/销售订单范围作为输入条件,支持两种展示方式:ALV表格和树形结构 核心功能包括: 物料主数据查询(MAKT/MARA表) 销售订单数据查询(VBAP表) BOM展开(CS_BOM_EXPL_MAT_V2函数) MRP数据获取(MA…

MIT线性代数01_方程组的几何解释

Linear Algebra Lecture #1 W. Gilbert Strangn linear equations, n unknowns row picturecol pictureMatrix form {2x−y0−x2y3 \left\{\begin{matrix} 2x - y 0 \\ -x 2y 3 \end{matrix}\right. {2x−y0−x2y3​ 1 Row Picture2 Column PictureWhat are all combination…

FreeRTOS-中断管理

学习内容中断概念中断是计算机系统中一种重要的事件驱动机制,用于在特定条件下打断正在执行的程序,并跳转到预定义的中断处理程序中执行特定的操作。当发生中断时,处理器会立即中止当前正在执行的指令,保存当前的执行状态&#xf…

图像梯度处理与边缘检测

在图像处理的世界里,我们常常需要从复杂的像素矩阵中提取有意义的信息 —— 比如一张照片中物体的轮廓、医学影像中病灶的边界、自动驾驶视野里的道路边缘。这些 “边界” 或 “轮廓” 在专业术语中被称为 “边缘”,而捕捉边缘的核心技术,离不…

GPU服务器与PC 集群(PC农场):科技算力双子星

在数字经济高速发展的今天,算力已成为驱动科技创新与产业变革的核心引擎。GPU服务器凭借其强大的并行计算能力,在图形渲染、人工智能训练等领域展现出不可替代的优势;而PC集群则通过分布式架构,以高性价比和灵活扩展特性&#xff…

秋招Day19 - 分布式 - 分布式锁

单体时代,可以直接用本地锁来实现对竞争资源的加锁,分布式环境下就要用到分布式锁了有哪些分布式锁的实现方案?MySQL分布式锁、Zookeeper分布式锁、Redis分布式锁MySQL分布式锁如何实现?创建一张锁表,对字段定义唯一性…

AIStarter平台亮点解析:从ComfyUI项目上架到一键运行的完整指南

大家好!今天分享一个AIStarter平台的深度体验,带你了解如何通过这个平台轻松上架和运行AI项目!视频中,博主在凌晨分享了AIStarter的强大功能,重点展示了ComfyUI 4.0和5.0整合包的上架过程,以及如何简化AI项…

电脑录屏软件推荐:如何使用oCam录制游戏、教程视频

在工作、学习或游戏过程中,我们经常需要录制电脑屏幕,比如制作教程视频、记录游戏操作、分享软件使用过程等。oCam 是一款功能强大且操作简单的屏幕录制工具,支持 Windows 系统,深受用户喜爱。今天简鹿办公就来手把手教你如何使用…

安装cuml报错

安装命令 (注意cuda的版本) pip install --no-cache-dir --extra-index-urlhttps://pypi.nvidia.com cuml-cu11 报错: 找了很多网上的教程 1.版本问题 没解决 pip install --upgrade pip pip install --upgrade setuptools 2.参考下面博…

【ECharts✨】解决Vue 中 v-show 导致组件 ECharts 样式异常问题

解决Vue 中 v-show 导致组件 ECharts 样式异常问题 问题概述 在使用 Vue 的 v-show 指令实现 <PageOne/>、<PageTwo/>、<PageThree/> 三个视图的定时切换时&#xff0c;<PageTwo/> 显示时出现了异常&#xff0c;具体表现为 ECharts 图表渲染图表尺寸异…

旅游管理虚拟仿真实训室:重构实践教学新生态

在旅游产业数字化转型与教育信息化深度融合的背景下&#xff0c;旅游管理虚拟仿真实训室成为连接理论教学与行业实践的关键纽带。它通过沉浸式技术还原旅游场景&#xff0c;解决传统实训中资源受限、风险较高、时空局限等问题&#xff0c;为旅游管理专业人才培养提供全新路径。…

【在线五子棋对战】十、对战玩家匹配管理模块

文章目录前言Ⅰ. 匹配队列实现Ⅱ. 匹配队列管理类实现完整代码前言 五子棋对战的玩家匹配是根据自己的天梯分数进行匹配的&#xff0c;而服务器中将玩家天梯分数分为三个档次&#xff1a; 青铜&#xff1a;天梯分数小于 2000 分白银&#xff1a;天梯分数介于 2000~3000 分之间…

k8s之ingress定义https访问方式

接上文&#xff1a;https://blog.csdn.net/soso678/article/details/149607069?spm1001.2014.3001.5502定义后端应用与service [rootmaster ingress]# cat my-nginx.yml apiVersion: apps/v1 kind: Deployment metadata:name: my-nginx spec:selector:matchLabels:run: my-n…

《C++ vector 完全指南:vector的模拟实现》

《C vector 完全指南&#xff1a;vector的模拟实现》 文章目录《C vector 完全指南&#xff1a;vector的模拟实现》一、定义vector的成员变量二、用vector实现动态二维数组三、vector的接口实现1.vector的默认成员函数&#xff08;1&#xff09;构造函数实现&#xff08;2&…

腾讯云代码助手使用指南

腾讯云代码助手使用指南什么是腾讯云代码助手功能区展示功能介绍功能演示一、创建新项目1.先用Chat 把口语化的需求转换成AI更容易接受的结构化提示词2.再用Craft 模式进行代码生成3.成果展示二、老项目探索1.使用Codebase 帮理解项目代码三、代码补全1.只需输入标准的函数名&a…