PostgreSQL - HAVING 子句:初学者的友好指南
你好,有抱負的數據庫愛好者!今天,我們將要深入 PostgreSQL 的一个令人興奮的主題:HAVING 子句。別擔心如果你是編程新手;我會一步步地帶領你了解這個概念,就像我這些年來為無數學生做的那樣。所以,來一杯你喜歡的飲料,讓我們一起踏上這次學習冒險吧!
HAVING 子句是什麼?
在我們深入細節之前,讓我們先了解 HAVING 子句是什麼。想像你正在籌備一個大型派對(數據庫),你想根據他們喜歡的顏色(GROUP BY)將你的客人(數據)分組。現在,如果你只想關注人數超過五個的顏色群體,那麼 HAVING 子句就派上用場了!
在 PostgreSQL 中,HAVING 子句讓我們能夠根據特定條件過濾分組後的數據。這就像你派對上的保鏢,根據你的標準決定哪些群體可以留下。
HAVING 子句的語法
讓我們來看看 HAVING 子句的基本語法:
SELECT column1, column2, ..., aggregate_function(column)
FROM table_name
GROUP BY column1, column2, ...
HAVING condition;
這裡的每一部分意味著:
-
SELECT
:指定我們想要檢索的列。 -
aggregate_function
:像 COUNT()、SUM()、AVG() 等函數。 -
FROM
:指示我們正在查詢的表。 -
GROUP BY
:將結果按一個或多個列分組。 -
HAVING
:根據條件過濾分組後的結果。
現在,讓我們通過一些例子來看看這是如何運作的!
示例 1:基本的 HAVING 子句
想像我們有一個名為 employees
的表,包含列:id
、name
、department
和 salary
。讓我們找出平均薪資超過 50,000 美元的部門。
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;
這個查詢會執行以下操作:
- 按部門將員工分組。
- 計算每個部門的平均薪資。
- 只顯示平均薪資超過 50,000 美元的部門。
示例 2:HAVING 與 COUNT
現在,讓我們找出員工數量超過 5 人的部門:
SELECT department, COUNT(*) as employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;
這裡發生了什麼:
- 我們按部門將員工分組。
- 我們計算每個部門的員工數量。
- 我們只顯示員工數量超過 5 人的部門。
示例 3:結合 WHERE 和 HAVING
讓我們來得更加時尚一點!我們將找出平均薪資超過 60,000 美元的部門,但只考慮 2010 年之後錄用的員工:
SELECT department, AVG(salary) as avg_salary
FROM employees
WHERE hire_date > '2010-01-01'
GROUP BY department
HAVING AVG(salary) > 60000;
這個查詢:
- 過濾出 2010 年之後錄用的員工(使用 WHERE)。
- 將剩下的員工按部門分組。
- 計算每個組的平均薪資。
- 只顯示平均薪資超過 60,000 美元的部門。
WHERE 與 HAVING 的區別
現在,你可能會想,「我們為什麼不能只用 WHERE 來做所有的事情?」這個問題問得好!這裡有一個簡單的方法來記住:
- WHERE 在將行分組之前過濾單個行。
- HAVING 在行分組之後過濾組。
這就像這樣:WHERE 是在大門口的保鏢,檢查身份證,而 HAVING 是裡面的保鏢,根據他們的行為決定哪些群體可以留下。
與 HAVING 一起使用的常見聚合函數
這裡有一個常見聚合函數的便捷表格,你可以與 HAVING 一起使用:
函數 | 描述 | 示例 |
---|---|---|
COUNT() | 計算行的數量 | HAVING COUNT(*) > 5 |
SUM() | 計算一組值的總和 | HAVING SUM(salary) > 100000 |
AVG() | 計算一組值的平均值 | HAVING AVG(age) < 30 |
MAX() | 查找最大值 | HAVING MAX(price) < 1000 |
MIN() | 查找最小值 | HAVING MIN(rating) > 3 |
實踐練習:讓我們來個派對!
為了加強我們的理解,讓我們來籌備我們之前提到的派對。我們將使用一個名為 guests
的表,包含列:name
、age
、favorite_color
和 bringing_snacks
。
-- 找出顏色群體超過 3 位客人,且平均年齡超過 25 歲
SELECT favorite_color, COUNT(*) as guest_count, AVG(age) as avg_age
FROM guests
GROUP BY favorite_color
HAVING COUNT(*) > 3 AND AVG(age) > 25;
-- 找出超過 50% 的客人帶點心的顏色群體
SELECT favorite_color,
COUNT(*) as total_guests,
SUM(CASE WHEN bringing_snacks THEN 1 ELSE 0 END) as snack_bringers
FROM guests
GROUP BY favorite_color
HAVING SUM(CASE WHEN bringing_snacks THEN 1 ELSE 0 END) > COUNT(*) / 2;
在這些查詢中,我們使用 HAVING 來確保我們的派對群體符合某些標準。這就像確保每個顏色群體都有足夠的人數,並且為點心池做出貢獻!
結論
恭喜你!你剛剛踏出了進入 HAVING 子句世界的第一步。記住,當你需要過濾分組數據時,HAVING 是你的朋友。這就像有一個聰明的助手,可以在他們形成彩色群體後分析你的派對客人。
在你繼續 PostgreSQL 的旅程時,你會發現 HAVING 子句在數據分析和報告中非常有用。繼續練習,很快你就能像專家一樣進行分組和過濾數據了!
快樂查詢,願你的數據庫總是井然有序,你的查詢總是最優化!
Credits: Image by storyset