SQL - HAVING 子句
Hello, 未來的 SQL 巫師們!今天,我們將踏上一段令人興奮的旅程,進入 SQL 中 HAVING 子句的世界。作為你們友好的鄰居計算機老師,我在這裡指導你們完成這次冒險,一步一步地。所以,拿起你的虛擬筆記本,我們來深入探讨吧!
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;
這裡發生了什麼:
- 我們按產品類別將產品分組。
- 我們計算每個類別中有多少產品。
- HAVING 子句只讓那些產品數量超過 10 的類別通過。
- 最後,我們按產品數量降序排列結果。
這就像是在整理衣櫥,但只保留有超過 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 客戶:
- 我們按客戶將訂單分組。
- 我們計算每個客戶花費的總額。
- HAVING 子句過濾出花費超過 1000 美元的客戶。
- 然後我們按這些 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;
這個查詢是在尋找多产的作者:
- 我們按作者將書籍分組。
- 我們計算每個作者寫了多少本書。
- HAVING 子句只保留那些有 5 本或更多書籍的作者。
- 我們按結果排序,以先看到最多产的作者。
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;
這個查詢就像是在尋找表現出色的部門:
- 我們按部門將表現分數分組。
- 我們計算每個部門的平均分數。
- HAVING 子句只保留平均分數超過 8.5 的部門。
- 我們按結果排序,以先看到表現最好的部門。
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;
這個查詢是在尋找奢侈品類別:
- 我們按產品類別將產品分組。
- 我們找到每個類別中的最高價格。
- HAVING 子句只保留至少有一個產品價格超過 1000 美元的類別。
- 我們按結果排序,以先看到最昂貴商品的類別。
這就是,各位!你們剛剛學會了 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