首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 無 GROUP BY 直接用 HAVING 陷阱:GROUP BY NULL 等價 LIMIT 1 導致 MIN/MAX 取全局值

     編輯:MySQL 資料庫相關知識

現象複現

SELECT * FROM t HAVING id = MIN(id);  -- 返回 id=1
SELECT * FROM t HAVING id = MAX(id);  -- 空結果

根因揭秘

  1. MySQL 將單獨 HAVING 重寫為 GROUP BY NULL HAVING ...
  2. GROUP BY NULL 產生單一分組,**只包含第一行數據**(等價 LIMIT 1)
  3. 但聚合函數 MIN()/MAX() 計算的是**全表**值,非分組內值

驗證實驗

-- 資料:(a=10,id=1), (a=1,id=3)
SELECT * FROM t2 GROUP BY NULL;  -- 只返回第一行 (10,1)

SELECT MAX(a),MIN(a),MAX(id),MIN(id) FROM t2 GROUP BY NULL;
-- 結果:MAX(a)=10, MIN(a)=1, MAX(id)=3, MIN(id)=1  ← 全表聚合!

-- 對比正常 GROUP BY a
SELECT MAX(a),MIN(a) FROM t2 GROUP BY a;  -- 每組各 1 行,MAX=MIN

結論

  • HAVING id=MIN(id) 實際等價 HAVING id=1 → 命中第一行
  • HAVING id=MAX(id) 實際等價 HAVING id=3 → 第一行 id=1 不匹配 → 空結果
  • 修改資料順序後現象會反轉

最佳實踐

❌ 別用無 GROUP BY 的 HAVING 玩花樣
✅ 規範寫法:SELECT * FROM t ORDER BY id LIMIT 1;(取最小)
✅ 規範寫法:SELECT * FROM t ORDER BY id DESC LIMIT 1;(取最大)

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