SQL HAVING 子句入門

更新日期: 2025 年 3 月 4 日

在 SQL 查詢中,當我們使用 GROUP BY 來對數據進行分組時,往往需要對分組後的結果進行篩選。

例如,想要篩選銷售總額超過 10,000 元的客戶,或者訂單數量大於 5 筆的商品,這時候我們就不能直接使用 WHERE,而是要用 HAVING 子句。

HAVINGWHERE 的主要區別在於:

  • WHERE 用於篩選 個別記錄(行數據),在 GROUP BY 之前執行。
  • HAVING 用於篩選 分組後的結果,在 GROUP BY 之後執行。

本篇文章將帶你了解 SQL HAVING 子句的語法、使用場景,並透過實例來幫助你掌握 HAVING 的用法。


SQL HAVING 的基本語法

HAVING 語法結構

SELECT 欄位, 聚合函數
FROM 資料表
GROUP BY 欄位
HAVING 條件;

語法解析:

  1. SELECT:指定要查詢的欄位,通常包含聚合函數(如 SUM()COUNT())。
  2. FROM:指定要查詢的資料表。
  3. GROUP BY:將數據進行分組。
  4. HAVING:用來篩選 GROUP BY 產生的分組結果。

HAVINGWHERE 的區別

比較項目WHEREHAVING
適用範圍個別記錄(行數據)分組後的結果
使用時機GROUP BY 之前GROUP BY 之後
是否能使用聚合函數❌ 不能✅ 可以
示例WHERE price > 100HAVING SUM(price) > 1000

示例 1️⃣:WHERE 篩選原始數據

SELECT * FROM orders WHERE price > 100;

這會篩選 每一筆訂單金額超過 100 的記錄。

示例 2️⃣:HAVING 篩選分組結果

SELECT customer_id, SUM(price) AS total_spent
FROM orders
GROUP BY customer_id
HAVING total_spent > 1000;

這會篩選出 「總消費金額超過 1000 元的顧客」,這在 WHERE 是無法做到的。


HAVING 的常見應用場景

篩選總銷售額大於 10,000 的客戶

SELECT customer_id, SUM(price) AS total_sales
FROM orders
GROUP BY customer_id
HAVING total_sales > 10000;

📌 解釋:

  • GROUP BY customer_id:先依據顧客 ID 進行分組。
  • SUM(price) AS total_sales:計算每位顧客的總消費金額。
  • HAVING total_sales > 10000:篩選出總銷售額大於 10,000 的客戶。

篩選訂單數超過 5 筆的商品

SELECT product_id, COUNT(*) AS order_count
FROM orders
GROUP BY product_id
HAVING order_count > 5;

📌 解釋:

  • COUNT(*) AS order_count:計算每個產品的訂單數量。
  • HAVING order_count > 5:只顯示訂單數量超過 5 的商品。

篩選平均評分大於 4.5 的商品

SELECT product_id, AVG(rating) AS avg_rating
FROM reviews
GROUP BY product_id
HAVING avg_rating > 4.5;

📌 解釋:

  • AVG(rating):計算商品的平均評分。
  • HAVING avg_rating > 4.5:只保留平均評分高於 4.5 的商品。

篩選同一天有超過 3 筆訂單的顧客

SELECT customer_id, order_date, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id, order_date
HAVING order_count > 3;

📌 解釋:

  • GROUP BY customer_id, order_date:依據 顧客 ID + 訂單日期 進行分組。
  • COUNT(*) AS order_count:計算每位顧客在特定日期內的訂單數。
  • HAVING order_count > 3:篩選出同一天訂單超過 3 筆的顧客。

結論

重點回顧

  • HAVING 用於篩選 GROUP BY 之後的結果,而 WHERE 則是在分組前篩選個別記錄。
  • HAVING 能夠與聚合函數(SUM、COUNT、AVG 等)一起使用,而 WHERE 則不能。
  • HAVING 適用於篩選銷售額、訂單數量、平均評分等匯總數據的場景。

📌 如果數據還沒有被 GROUP BY,請用 WHERE;如果數據已經分組,則用 HAVING

希望這篇文章能幫助你掌握 SQL HAVING 的用法,趕快試試這些 SQL 查詢,強化你的 SQL 技能吧!

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *