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

Oracle 與 MySQL 中 HAVING 子句的差異:是否必須配合 GROUP BY

     編輯:MySQL 綜合教學

Oracle vs MySQL:HAVING 子句是否強制要求 GROUP BY

核心結論:Oracle 強制 HAVING 必須配合 GROUP BY 使用;MySQL 允許 HAVING 獨立使用,等價於 WHERE。

Oracle 行為

SQL> SELECT * FROM test1 HAVING owner = 'SYS';
ORA-00979: not a GROUP BY expression

SQL> SELECT owner, COUNT(1) FROM test1 GROUP BY owner HAVING owner = 'SYS';
OWNER   COUNT(1)
SYS     30754

無 GROUP BY 直接報錯。

MySQL 行為

mysql> SELECT * FROM test HAVING id > 98;
+------+-------------+
| id   | create_time |
+------+-------------+
| 99   | 2014-08-12  |
| 100  | 2014-08-12  |
+------+-------------+

mysql> SELECT id, COUNT(1) FROM test GROUP BY id HAVING id > 98;
+------+----------+
| id   | COUNT(1) |
+------+----------+
| 99   | 1        |
| 100  | 1        |
+------+----------+

MySQL 允許無 GROUP BY 的 HAVING,作用等同 WHERE;有 GROUP BY 時按分組過濾。

標準 SQL 與實現差異

  • SQL 標準:HAVING 為分組後過濾,需配合 GROUP BY。
  • MySQL 擴展:允許無 GROUP BY 的 HAVING,視為全表單一分組。
  • 遷移建議:跨庫 SQL 統一加 GROUP BY,或將無分組過濾改寫為 WHERE,保證可移植性。

總結

編寫跨庫兼容 SQL 時,始終在 HAVING 前加上 GROUP BY;純 MySQL 環境可利用其擴展簡化單表過濾,但需注意語義差異(HAVING 可用聚合函數,WHERE 不可)。

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