PostgreSQL - HAVING 子句:初学者的友好指南

你好,有抱負的數據庫愛好者!今天,我們將要深入 PostgreSQL 的一个令人興奮的主題:HAVING 子句。別擔心如果你是編程新手;我會一步步地帶領你了解這個概念,就像我這些年來為無數學生做的那樣。所以,來一杯你喜歡的飲料,讓我們一起踏上這次學習冒險吧!

PostgreSQL - Having Clause

HAVING 子句是什麼?

在我們深入細節之前,讓我們先了解 HAVING 子句是什麼。想像你正在籌備一個大型派對(數據庫),你想根據他們喜歡的顏色(GROUP BY)將你的客人(數據)分組。現在,如果你只想關注人數超過五個的顏色群體,那麼 HAVING 子句就派上用場了!

在 PostgreSQL 中,HAVING 子句讓我們能夠根據特定條件過濾分組後的數據。這就像你派對上的保鏢,根據你的標準決定哪些群體可以留下。

HAVING 子句的語法

讓我們來看看 HAVING 子句的基本語法:

SELECT column1, column2, ..., aggregate_function(column)
FROM table_name
GROUP BY column1, column2, ...
HAVING condition;

這裡的每一部分意味著:

  1. SELECT:指定我們想要檢索的列。
  2. aggregate_function:像 COUNT()、SUM()、AVG() 等函數。
  3. FROM:指示我們正在查詢的表。
  4. GROUP BY:將結果按一個或多個列分組。
  5. HAVING:根據條件過濾分組後的結果。

現在,讓我們通過一些例子來看看這是如何運作的!

示例 1:基本的 HAVING 子句

想像我們有一個名為 employees 的表,包含列:idnamedepartmentsalary。讓我們找出平均薪資超過 50,000 美元的部門。

SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;

這個查詢會執行以下操作:

  1. 按部門將員工分組。
  2. 計算每個部門的平均薪資。
  3. 只顯示平均薪資超過 50,000 美元的部門。

示例 2:HAVING 與 COUNT

現在,讓我們找出員工數量超過 5 人的部門:

SELECT department, COUNT(*) as employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;

這裡發生了什麼:

  1. 我們按部門將員工分組。
  2. 我們計算每個部門的員工數量。
  3. 我們只顯示員工數量超過 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;

這個查詢:

  1. 過濾出 2010 年之後錄用的員工(使用 WHERE)。
  2. 將剩下的員工按部門分組。
  3. 計算每個組的平均薪資。
  4. 只顯示平均薪資超過 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 的表,包含列:nameagefavorite_colorbringing_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