MySQL HAVING 子句使用教學|與 WHERE 子句差異與實作範例

1. HAVING子句是什麼

HAVING子句是在SQL中對資料分組後,對其彙總結果加上條件的語法。通常與GROUP BY子句結合使用,負責過濾彙總後的資料。使用HAVING子句可以只抽取符合特定標準的群組。 例如,想要抽取銷售總額超過一定金額的客戶,或平均分數超過特定水準的群組時會使用HAVING子句。WHERE子句是對彙總前的個別列加條件,而HAVING子句則是對彙總後的結果加條件,兩者有所不同。

HAVING子句的使用範例

例如,抽取銷售總額超過10,000日圓的客戶的查詢如下。
SELECT 客戶ID, SUM(銷售) AS 總銷售
FROM 銷售表
GROUP BY 客戶ID
HAVING SUM(銷售) > 10000;
此查詢使用SUM函數將各客戶的銷售額加總,僅抽取結果超過10,000日圓的客戶。

2. HAVING 子句的基本語法與使用方式

HAVING 子句的基本語法如下。
SELECT 欄位名稱, 聚合函數(欄位名稱)
FROM 資料表名稱
GROUP BY 欄位名稱
HAVING 條件式;
此語法會在 GROUP BY 子句中將資料分組,並在 HAVING 子句中指定條件,以篩選聚合結果。例如,從銷售表格中抽取每位顧客的訂單數量達 5 件以上的顧客的查詢如下。
SELECT 顧客ID, COUNT(訂單ID) AS 訂單數
FROM 訂單資料表
GROUP BY 顧客ID
HAVING COUNT(訂單ID) >= 5;
此處使用 COUNT 函數計算每位顧客的訂單數量僅篩選出訂單數量達 5 件以上的顧客。

3. HAVING句的應用範例

HAVING子句是結合聚合函數,用於高階資料分析的工具。以下將介紹幾個具體的應用範例。

範例1:依銷售總額過濾

要抽取銷售額超過10,000日圓的商品,請使用以下的SUM函數。
SELECT 商品ID, SUM(売上) AS 合計売上
FROM 商品テーブル
GROUP BY 商品ID
HAVING SUM(売上) > 10000;
此查詢會計算每個商品的銷售總額,並抽取總額超過10,000日圓的商品。

範例2:依訂單數過濾

當特定客戶的訂單數達到10筆以上時,抽取該客戶。
SELECT 顧客ID, COUNT(注文ID) AS 注文数
FROM 注文テーブル
GROUP BY 顧客ID
HAVING COUNT(注文ID) > 10;
此查詢會計算每個客戶的訂單數,僅抽取訂單數達10筆以上的客戶。

4. WHERE子句的差異

HAVING子句與WHERE子句皆會對資料進行篩選,但其適用時機不同。

適用時機的差異

  • WHERE子句: 在資料分組前套用,對各個行進行篩選。
  • HAVING子句: 在資料分組後套用,對彙總結果進行篩選。
例如,結合WHERE子句與HAVING子句的查詢,會先以WHERE子句篩選出銷售額大於等於1000元的資料,然後再以HAVING子句抽取總銷售額超過5,000元的結果。
SELECT 顧客ID, SUM(銷售額) AS 總銷售額
FROM 銷售表
WHERE 銷售額 >= 1000
GROUP BY 顧客ID
HAVING SUM(銷售額) > 5000;
在此查詢中,對以WHERE子句篩選的資料套用GROUP BYHAVING,抽取銷售額在5,000元以上的客戶。

5. 使用 HAVING 子句時的注意事項

需要與彙總函數一起使用

HAVING 子句是對彙總結果進行篩選,因此需要與 SUMCOUNT 等彙總函數一起使用。對個別行的條件應使用 WHERE 子句較為適當。

使用別名

在 HAVING 子句中,可以使用 AS 指定的別名來撰寫條件式。例如,可以像以下這樣為總銷售額加上別名並使用。
SELECT 顧客ID, SUM(銷售額) AS 總銷售額
FROM 銷售表
GROUP BY 顧客ID
HAVING 總銷售額 > 10000;
此查詢會抽取總銷售額超過 10,000 元的客戶。

6. 總結:HAVING 子句的活用方式

HAVING 子句是一個強大的工具,可對彙總資料加上條件,靈活地過濾資料。特別是在分析銷售額或訂單數等彙總資料時,活用 HAVING 子句即可實現高效的資料分析。了解與 WHERE 子句的差異,並適當結合使用,能將 SQL 查詢的彈性發揮到最大。