SQL - HAVING 子句

Hello, 未來的 SQL 巫師們!今天,我們將踏上一段令人興奮的旅程,進入 SQL 中 HAVING 子句的世界。作為你們友好的鄰居計算機老師,我在這裡指導你們完成這次冒險,一步一步地。所以,拿起你的虛擬筆記本,我們來深入探讨吧!

SQL - Having Clause

SQL 的 HAVING 子句

想像一下,你正在試圖組織一個派對,但你只想邀請那些與你有超過五個共同朋友的人。這正是 SQL 中的 HAVING 子句的作用——它幫助我們根據特定條件過濾分組結果。

HAVING 子句就像是你數據派對大門的保鏢。它根據你設定的規則決定哪些數據組可以進來。讓我們看一個簡單的例子:

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

在這個例子中,我們正在查看每個部門的平均薪水,但我們只想看到平均薪水超過 50,000 美元的部門。HAVING 子句就是我們的保鏢,檢查每個組(部門),只讓符合我們標準的組進來。

HAVING 與 GROUP BY 子句的配合使用

HAVING 子句通常與 GROUP BY 手拉手使用,就像兩個總是形影不離的好朋友。當 GROUP BY 將我們的數據組織成組時,HAVING 則根據條件過濾這些組。

讓我們再看一個例子:

SELECT product_category, COUNT(*) as product_count
FROM products
GROUP BY product_category
HAVING COUNT(*) > 10
ORDER BY product_count DESC;

這裡發生了什麼:

  1. 我們按產品類別將產品分組。
  2. 我們計算每個類別中有多少產品。
  3. HAVING 子句只讓那些產品數量超過 10 的類別通過。
  4. 最後,我們按產品數量降序排列結果。

這就像是在整理衣櫥,但只保留有超過 10 項商品的區域,並按商品數量從多到少排列。

HAVING 與 ORDER BY 子句的配合使用

正如你在前一個例子中所看到的,HAVING 也與 ORDER BY 相處得很好。讓我們再看一個例子:

SELECT customer_id, SUM(order_total) as total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(order_total) > 1000
ORDER BY total_spent DESC;

這個查詢就像是在尋找你的 VIP 客戶:

  1. 我們按客戶將訂單分組。
  2. 我們計算每個客戶花費的總額。
  3. HAVING 子句過濾出花費超過 1000 美元的客戶。
  4. 然後我們按這些 VIP 客戶的消費額從高到低排序。

HAVING 子句與 COUNT() 函數的配合使用

COUNT() 函數就像是 HAVING 的忠實夥伴,總是準備好幫助計數。這裡有一個例子:

SELECT author, COUNT(book_id) as book_count
FROM books
GROUP BY author
HAVING COUNT(book_id) >= 5
ORDER BY book_count DESC;

這個查詢是在尋找多产的作者:

  1. 我們按作者將書籍分組。
  2. 我們計算每個作者寫了多少本書。
  3. HAVING 子句只保留那些有 5 本或更多書籍的作者。
  4. 我們按結果排序,以先看到最多产的作者。

HAVING 子句與 AVG() 函數的配合使用

AVG() 是 HAVING 的另一個好朋友。讓我們看看他們一起工作的情況:

SELECT department, AVG(performance_score) as avg_score
FROM employee_performance
GROUP BY department
HAVING AVG(performance_score) > 8.5
ORDER BY avg_score DESC;

這個查詢就像是在尋找表現出色的部門:

  1. 我們按部門將表現分數分組。
  2. 我們計算每個部門的平均分數。
  3. HAVING 子句只保留平均分數超過 8.5 的部門。
  4. 我們按結果排序,以先看到表現最好的部門。

HAVING 子句與 MAX() 函數的配合使用

最後但同樣重要的是,讓我們看看 HAVING 如何與 MAX() 合作:

SELECT product_category, MAX(price) as highest_price
FROM products
GROUP BY product_category
HAVING MAX(price) > 1000
ORDER BY highest_price DESC;

這個查詢是在尋找奢侈品類別:

  1. 我們按產品類別將產品分組。
  2. 我們找到每個類別中的最高價格。
  3. HAVING 子句只保留至少有一個產品價格超過 1000 美元的類別。
  4. 我們按結果排序,以先看到最昂貴商品的類別。

這就是,各位!你們剛剛學會了 SQL 中的 HAVING 子句及其最佳夥伴。記住,熟能生巧,所以不要害怕嘗試這些查詢。在你還未意識到之前,你就會像專業人士一樣编写複雜的 SQL 查詢!

這裡是我們所涵蓋方法的快速參考表:

方法 描述 示例
HAVING 過濾分組結果 HAVING AVG(salary) > 50000
GROUP BY 將具有相似值的行分組 GROUP BY department
ORDER BY 對結果集進行排序 ORDER BY total_spent DESC
COUNT() 計算行數 HAVING COUNT(book_id) >= 5
AVG() 計算一組值的平均值 HAVING AVG(performance_score) > 8.5
MAX() 返回一組中的最大值 HAVING MAX(price) > 1000

快樂查詢,願你的數據永遠乾淨,查詢高效!

Credits: Image by storyset