Mysql
SQL 有子句
當我遇到這個網站時,我正在研究have條款。
這篇文章的最後兩行讓我感到困惑。
- 與 WHERE 子句類似,HAVING 子句要求出現在子句中的列名也必須作為列名出現在 GROUP BY 子句中。
- 與 WHERE 子句類似,未出現在 GROUP BY 子句中的列名可以作為聚合函式的參數出現。
在第一句話中,我的理解是出現在 Group by 子句中的列名也必須出現在 Have 子句中。
例如:
按 empno 分組。
有empno。< 10;
但是在很多地方,Having 子句的列名與 Group By 子句不同。那麼這是一個錯誤嗎?
在 HAVING 子句中“按原樣”使用它們是錯誤的,但可以使用其他列名,如下所示:
SELECT empno FROM orders GROUP BY empno HAVING SUM(value) > 1000
這將為您提供總訂單價值為 1000 或更多的員工。在這種情況下,
value
不會出現在 GROUP BY 中,但它是SUM
. 就像你做不到一樣SELECT empno, value FROM orders GROUP BY empno
(因為
value
不在 GROUP BY 中)但你可以這樣做SELECT empno, SUM(value) FROM orders GROUP BY empno
這種情況的一個特殊情況是使用
*
,例如要讓員工至少有 10 個訂單,您可以使用:SELECT empno FROM orders GROUP BY empno HAVING COUNT(*) >= 10
這不是錯誤,但您需要特別注意連結文章的前幾行。
不能在 WHERE 子句中使用組函式。SQL 語句可以同時包含 WHERE 子句和 HAVING 子句。WHERE 在分組前過濾數據, HAVING 在分組後過濾數據。
WHERE 子句允許您在結果到達分組語句之前過濾結果,這將允許查詢更快地執行,因為這意味著總體聚合的數據更少。
HAVING 子句將允許您在分組語句之後過濾數據,並讓您根據聚合值限制輸出。
如果我想按聚合列過濾結果,我通常只使用 HAVING 子句(比如我只想要總銷售額高於 X 的結果)。我使用 WHERE 子句只獲得我想要的年份的結果。