如果你已接觸編寫 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 中的查詢和第一頁結果:
從這些租借數字來看,我們本來可以進一步縮短清單!
使用 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 中的查詢和第一頁結果:
組合多個條件
正如 WHERE 子句使用 AND 和 OR 關鍵字支援多個條件一樣,HAVING 也是如此。例如,我們可以透過將 HAVING 子句修改為以下方式來尋找租賃數量在特定範圍內的顧客:
HAVING total_rentals >= 3 AND total_rentals <= 10
總結
在今天的文章中,我們學習如何使用 HAVING 子句篩選已分組和彙總的欄位。
對 Navicat Premium 有興趣?你可以免費試用 14 天進行評估!