核心結論:Oracle 強制 HAVING 必須配合 GROUP BY 使用;MySQL 允許 HAVING 獨立使用,等價於 WHERE。
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> 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 時按分組過濾。
HAVING 為分組後過濾,需配合 GROUP BY。GROUP BY 的 HAVING,視為全表單一分組。GROUP BY,或將無分組過濾改寫為 WHERE,保證可移植性。編寫跨庫兼容 SQL 時,始終在 HAVING 前加上 GROUP BY;純 MySQL 環境可利用其擴展簡化單表過濾,但需注意語義差異(HAVING 可用聚合函數,WHERE 不可)。