在 SQL 查詢中,當我們使用 GROUP BY 來對數據進行分組時,往往需要對分組後的結果進行篩選。
例如,想要篩選銷售總額超過 10,000 元的客戶,或者訂單數量大於 5 筆的商品,這時候我們就不能直接使用 WHERE,而是要用 HAVING 子句。
HAVING 與 WHERE 的主要區別在於:
WHERE用於篩選 個別記錄(行數據),在GROUP BY之前執行。HAVING用於篩選 分組後的結果,在GROUP BY之後執行。
本篇文章將帶你了解 SQL HAVING 子句的語法、使用場景,並透過實例來幫助你掌握 HAVING 的用法。
SQL HAVING 的基本語法
HAVING 語法結構
SELECT 欄位, 聚合函數
FROM 資料表
GROUP BY 欄位
HAVING 條件;
語法解析:
SELECT:指定要查詢的欄位,通常包含聚合函數(如SUM()、COUNT())。FROM:指定要查詢的資料表。GROUP BY:將數據進行分組。HAVING:用來篩選GROUP BY產生的分組結果。
HAVING 與 WHERE 的區別
| 比較項目 | WHERE | HAVING |
|---|---|---|
| 適用範圍 | 個別記錄(行數據) | 分組後的結果 |
| 使用時機 | GROUP BY 之前 | GROUP BY 之後 |
| 是否能使用聚合函數 | ❌ 不能 | ✅ 可以 |
| 示例 | WHERE price > 100 | HAVING SUM(price) > 1000 |
WHERE個別記錄(行數據)
HAVING分組後的結果
WHEREGROUP BY 之前
HAVINGGROUP BY 之後
WHERE❌ 不能
HAVING✅ 可以
WHEREWHERE price > 100
HAVINGHAVING 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 技能吧!