Navicat Blog

使用HAVING 子句篩選彙總欄位 2024 年 10 月 8 日,由 Robert Gravelle 撰寫

如果你已接觸編寫 SQL 查詢一段時間,你可能對 WHERE 子句非常熟悉。雖然 WHERE 子句對彙總欄位沒有影響,但有一種方法可以根據彙總值篩選記錄,那就是使用 HAVING 子句。本文將介紹它的工作原理,並提供一些在 SELECT 查詢中使用它的範例。

彙總和 HAVING 子句

彙總通常與分組結合使用。在 SQL 中,這是使用 GROUP BY 子句來實現的。如果將彙總與分組一起使用,我們能夠從資料中獲取高層次的見解。例如,一家電子商務公司可能希望追蹤一段時間內的銷售情況。

很多時侯,我們可能不想對整個資料集套用 GROUP BY 子句。在這些情況下,我們可以使用 GROUP BY 命令以及條件性的 HAVING 子句來過濾掉不需要的結果。與 WHERE 子句類似,HAVING 可指定一個或多個篩選條件,但是針對一個群組或一個彙總。因此,HAVING 總是放在 WHERE 和 GROUP BY 子句之後,但在(可選的)ORDER BY 子句之前:

SELECT column_list
FROM table_name
WHERE where_conditions
GROUP BY column_list
HAVING having_conditions
ORDER BY order_expression

一些實際例子

為了更好地了解 HAVING 的工作原理,讓我們對 Sakila 範例資料庫 執行一些 SELECT 查詢。

我們的第一個查詢列出了電影租賃次數最多的顧客,以遞減順序來排序,以便租賃次數最多的人在最上面。我們將使用 HAVING 子句刪除租借少於三部電影的顧客,以便稍微縮短清單:

SELECT
  c.customer_id,
  c.first_name,
  c.last_name,
  COUNT(r.rental_id) AS total_rentals
FROM 
  customer AS c
    LEFT JOIN rental AS r ON c.customer_id = r.customer_id
GROUP BY c.customer_id
HAVING total_rentals >= 3
ORDER BY total_rentals DESC;

以下是在 Navicat Premium 中的查詢和第一頁結果:

top movie renters (89K)

從這些租借數字來看,我們本來可以進一步縮短清單!

使用 WHERE 和 HAVING 篩選列

就像 GROUP BY 和 ORDER BY在查詢程序中套用在不同的點上一樣,WHERE 和 HAVING 也是如此。因此,我們可以在分組和彙總之前和之後使用它們來篩選結果。例如,我們可以新增一個 WHERE 子句將結果限制為指定年份的上半年:

SELECT
  c.customer_id,
  c.first_name,
  c.last_name,
  COUNT(r.rental_id) AS total_rentals
FROM 
  customer AS c
    LEFT JOIN rental AS r ON c.customer_id = r.customer_id
WHERE r.rental_date BETWEEN '2005-01-01' AND '2005-06-30'
GROUP BY c.customer_id
HAVING total_rentals >= 3
ORDER BY total_rentals DESC;

再次,以下是在 Navicat Premium 中的查詢和第一頁結果:

top movie renters for first half of 2005 (96K)

組合多個條件

正如 WHERE 子句使用 AND 和 OR 關鍵字支援多個條件一樣,HAVING 也是如此。例如,我們可以透過將 HAVING 子句修改為以下方式來尋找租賃數量在特定範圍內的顧客:

HAVING total_rentals >= 3 AND total_rentals <= 10

總結

在今天的文章中,我們學習如何使用 HAVING 子句篩選已分組和彙總的欄位。

Navicat Premium 有興趣?你可以免費試用 14 天進行評估!

Navicat Blogs
Feed Entries
Blog Archives
Share