Mysql

SQL 有子句

  • November 10, 2021

當我遇到這個網站時,我正在研究have條款。

這篇文章的最後兩行讓我感到困惑。

  1. 與 WHERE 子句類似,HAVING 子句要求出現在子句中的列名也必須作為列名出現在 GROUP BY 子句中。
  2. 與 WHERE 子句類似,未出現在 GROUP BY 子句中的列名可以作為聚合函式的參數出現。

在第一句話中,我的理解是出現在 Group by 子句中的列名也必須出現在 Have 子句中。

例如:

按 empno 分組。

有empno。< 10;

但是在很多地方,Having 子句的列名與 Group By 子句不同。那麼這是一個錯誤嗎?

在 HAVING 子句中“按原樣”使用它們是錯誤的,但可以使用其他列名,如下所示:

SELECT empno
 FROM orders
 GROUP BY empno
 HAVING SUM(value) &gt; 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(*) &gt;= 10

這不是錯誤,但您需要特別注意連結文章的前幾行。

不能在 WHERE 子句中使用組函式。SQL 語句可以同時包含 WHERE 子句和 HAVING 子句。WHERE 在分組前過濾數據, HAVING 在分組後過濾數據。

WHERE 子句允許您在結果到達分組語句之前過濾結果,這將允許查詢更快地執行,因為這意味著總體聚合的數據更少。

HAVING 子句將允許您在分組語句之後過濾數據,並讓您根據聚合值限制輸出。

如果我想按聚合列過濾結果,我通常只使用 HAVING 子句(比如我只想要總銷售額高於 X 的結果)。我使用 WHERE 子句只獲得我想要的年份的結果。

引用自:https://dba.stackexchange.com/questions/302408