首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

MySQL GROUP BY 鬆綁行為:ONLY_FULL_GROUP_BY 模式下的相容性陷阱

     編輯:關於SqlServer

MySQL 5.7+ 預設啟用 ONLY_FULL_GROUP_BY,嚴格遵循 SQL 標準:SELECT 清單中的非彙總欄位必須出現在 GROUP BY 子句中。舊版或未啟用該模式時,MySQL 允許「非標準」寫法並任意取值,導致跨環境結果不一致。

重現場景

CREATE TABLE stud (
    sno VARCHAR(30) PRIMARY KEY,
    sname VARCHAR(30), age INT, saddress VARCHAR(30)
);
INSERT INTO stud VALUES
('1001','Tom',22,'湖南益陽'), ('1002','Jack',23,'益陽'),
('1003','李白',22,'益陽'), ('1004','王五',24,'中國北京'),
('1005','張三',22,'益陽'), ('1006','張四',23,'益陽'),
('1007','李四',22,'湖南益陽'), ('1008','劉備',24,'北京');

標準寫法(正確)

-- 僅選分組欄位 + 彙總函數
SELECT saddress, COUNT(*), AVG(age) FROM stud GROUP BY saddress;

非標準寫法(MySQL 嚴格模式報錯)

SELECT * FROM stud GROUP BY saddress;
-- ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause...

MySQL 鬆綁模式下的行為

若關閉 ONLY_FULL_GROUP_BY,上述查詢會「成功」執行,但每組僅回傳第一筆遇到的資料列,sno、sname、age 值具有隨機性,結果不可靠。

資料範例 嚴格模式報錯 僅選分組欄位成功 鬆綁模式結果

正確語法規則速記

✅ 合法❌ 非法
SELECT a,b,c FROM t GROUP BY a,b,c,d;SELECT a,b,c FROM t GROUP BY a,b;
SELECT a, MAX(b) FROM t GROUP BY a,c;SELECT a,b FROM t GROUP BY a;

最佳實踐

  • 永遠在嚴格模式下開發,避免上線環境行為差異。
  • 需顯示非分組欄位時,使用彙總函數(MAX、MIN、GROUP_CONCAT)或子查詢/視窗函數(MySQL 8.0+)正確取值。
  • 檢查 sql_mode:SELECT @@sql_mode; 確認 ONLY_FULL_GROUP_BY 狀態。

嚴格遵循 SQL 標準,才能寫出可移植、可預測的查詢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved