mysql having和where區別?各自適用場景

having和where的區別在于作用時機和場景:1.where在分組前篩選行,用于過濾原始數據,如篩選工資>5000的員工;2.having在分組后篩選結果,用于過濾聚合結果,如保留員工數>5的部門;3.兩者可同時使用,如先篩選工資>5000的員工,再保留平均工資>8000的部門;4.不能在where中使用聚合函數,因為其逐行判斷,而聚合計算需基于一組行。

mysql having和where區別?各自適用場景

mysql 查詢中,HAVING 和 WHERE 看起來都能用來篩選數據,但它們的作用時機和適用場景完全不同。簡單來說:WHERE 是在分組前篩選行,而 HAVING 是在分組后篩選結果。


一、WHERE:用于過濾原始數據行

WHERE 子句是在執行 GROUP BY 之前起作用的,它用來限制從表中檢索出來的原始數據行。

舉個例子:

select department, count(*) AS num_employees FROM employees WHERE salary > 5000 GROUP BY department;

這段語句的意思是:先找出工資大于 5000 的員工記錄,然后再按部門進行統計。也就是說,WHERE 只處理那些滿足條件的數據行,不會把不符合條件的行包含進來。

適用場景:

  • 在做聚合操作之前,先過濾掉不需要參與計算的數據。
  • 比如你想統計“年齡大于30歲的用戶”,那就應該用 WHERE age > 30。

二、HAVING:用于過濾分組后的結果

HAVING 是在 GROUP BY 完成之后才起作用的,它主要是用來篩選由 GROUP BY 產生的分組結果。

來看一個例子:

SELECT department, COUNT(*) AS num_employees FROM employees GROUP BY department HAVING COUNT(*) > 5;

這個查詢的意思是:先按部門分組,然后只保留員工數超過 5 人的部門。

注意:你不能在這里使用 WHERE COUNT(*) > 5,因為 WHERE 不認識聚合函數

適用場景:

  • 當你需要根據聚合結果(比如 COUNT, SUM, AVG)來過濾分組時。
  • 比如“找出訂單總金額超過1萬的客戶”,這時候就得用 HAVING SUM(order_amount) > 10000。

三、WHERE 和 HAVING 能一起用嗎?

當然可以!你可以同時使用 WHERE 和 HAVING 來完成更復雜的篩選任務。

例如:

SELECT department, AVG(salary) AS avg_salary FROM employees WHERE salary > 5000 GROUP BY department HAVING AVG(salary) > 8000;

這里做了兩步篩選:

  1. 先選出工資高于 5000 的員工;
  2. 再對這些員工按部門分組,并保留平均工資高于 8000 的部門。

這種組合方式非常常見,尤其在數據分析類查詢中。


四、什么時候容易混淆?

最容易搞混的是:為什么不能在 WHERE 中使用聚合函數?其實原因很簡單:WHERE 是逐行判斷的,而聚合函數是基于一組行計算出一個值,這在單條記錄上是無法完成的。

所以記住一句話:聚合字段只能出現在 SELECT 和 HAVING 中,不能出現在 WHERE 中。


基本上就這些了。理解 WHERE 和 HAVING 的區別,關鍵在于它們在 SQL 執行流程中的位置不同。寫查詢的時候,先想清楚你是要“先篩再分組”還是“分組后再篩”,就能正確選擇用了。

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享