SQL HAVING 子句入門
更新日期: 2025 年 3 月 4 日
在 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 |
示例 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 技能吧!