解決 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
英文地址,請注明出處:http://en.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…