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;
SELECT * FROM stud GROUP BY saddress;
-- ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause...
若關閉 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 標準,才能寫出可移植、可預測的查詢。