SQLite - GROUP BY 子句:解鎖數據聚合的力量
Hello, 有抱負的數據魔法師們!今天,我們將踏上一段令人興奮的旅程,進入 SQLite 的世界,並探索其最強大的功能之一:GROUP BY 子句。作為你們親切的鄰居計算機科學老師,我將指導你們一步一步地進行這次冒險。所以,拿起你的虛擬魔杖(鍵盤),我們一起來深入了解一下吧!
GROUP BY 子句是什麼?
在我們深入細節之前,讓我們先了解一下 GROUP BY 子句是什麼。想像你正在整理一堆色彩繽紛的樂高積木。你決定按照顏色將它們分組,以方便自己。這就是 GROUP BY 在 SQLite 中的基本作用——它根據一個或多個列將你的數據組織成組。
GROUP BY 子句通常與聚合函數如 COUNT()、MAX()、MIN()、SUM() 和 AVG() 一起使用,對每組行進行計算。這就像有一個有用的助手,不僅能夠按照顏色為你整理樂高積木,還能統計每種顏色有多少個!
語法:魔法詞語
現在,讓我們來看看我們 GROUP BY 語法的結構:
SELECT column1, column2, ..., aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column1, column2, ...
HAVING condition;
別擔心,這個看起來可能會有些令人生畏。我們將通過一些例子來一步一步分解它。
示例:GROUP BY 的實際應用
示例 1:按學院計算學生數量
讓我們從一個簡單的例子開始。想像我們有一個名為 'students' 的表,其中包含 'id'、'name'、'department' 和 'grade' 列。
CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT,
grade INTEGER
);
INSERT INTO students (name, department, grade) VALUES
('Alice', 'Computer Science', 85),
('Bob', 'Mathematics', 92),
('Charlie', 'Computer Science', 78),
('David', 'Physics', 95),
('Eve', 'Mathematics', 88);
SELECT department, COUNT(*) as student_count
FROM students
GROUP BY department;
這個查詢將給我們每個學院的學生數量。這裡發生了什麼:
- 我們選擇 'department' 列,並使用 COUNT(*) 函數計算行數。
- 我們按照 'department' 列對結果進行分組。
輸出將會類似這樣:
department | student_count |
---|---|
Computer Science | 2 |
Mathematics | 2 |
Physics | 1 |
示例 2:按學院計算平均成績
現在,讓我們計算每個學院的平均成績:
SELECT department, AVG(grade) as average_grade
FROM students
GROUP BY department;
這個查詢將學生按學院分組,並計算每個學院的平均成績。這裡的分解如下:
- 我們選擇 'department' 列。
- 我們在 'grade' 列上使用 AVG() 函數計算平均值。
- 我們按照 'department' 列對結果進行分組。
輸出可能會像這樣:
department | average_grade |
---|---|
Computer Science | 81.5 |
Mathematics | 90.0 |
Physics | 95.0 |
示例 3:結合 GROUP BY 和 WHERE 使用
讓我們說我們想要找到每個學院的平均成績,但僅限於成績超過 80 分的情況:
SELECT department, AVG(grade) as average_grade
FROM students
WHERE grade > 80
GROUP BY department;
這裡發生了什麼:
- WHERE 子句過濾掉了 80 分以下的成績。
- 然後,我們按照學院對剩餘的行進行分組。
- 最後,我們為每組計算平均成績。
結果可能會像這樣:
department | average_grade |
---|---|
Computer Science | 85.0 |
Mathematics | 90.0 |
Physics | 95.0 |
注意,由於我們過濾掉了 Charlie 的 78 分,計算機科學的平均分也發生了變化。
示例 4:與 GROUP BY 一起使用 HAVING
HAVING 子句與 WHERE 相似,但它與 GROUP BY 一起使用來過濾組。讓我們找到平均成績超過 85 分的學院:
SELECT department, AVG(grade) as average_grade
FROM students
GROUP BY department
HAVING average_grade > 85;
這裡的分解如下:
- 我們按照學院對學生進行分組。
- 我們計算每個學院的平均成績。
- HAVING 子句過濾掉了平均成績為 85 分或以下的學院。
輸出:
department | average_grade |
---|---|
Mathematics | 90.0 |
Physics | 95.0 |
常見 GROUP BY 函數
這裡是一個常用聚合函數與 GROUP BY 一起使用的表格:
函數 | 描述 |
---|---|
COUNT() | 計算組中的行數 |
SUM() | 計算值的總和 |
AVG() | 計算值的平均值 |
MAX() | 在組中找到最大值 |
MIN() | 在組中找到最小值 |
結論:GROUP BY 的力量
好了,我親愛的學生們!我們已經在 SQLite 的 GROUP BY 子句的神奇領域中進行了一次旅行。記住,GROUP BY 就像你的個人數據組織者,幫助你通過將類似項目分組來理解大量數據集。
當你們繼續你的 SQL 冒險時,你會發現 GROUP BY 是你數據分析工具包中不可或缺的工具。它不僅關於組織數據——它還關於揭露那些可能會隱藏在數據中的洞見和模式。
所以,下次當你面對一座數據山時,記住我們的樂高積木比喻。組織你的數據,計算聚合,觀察意義深遠的模式從混亂中出現。愉快地查詢,願你的 GROUP BY 子句總是高效且富有洞察力!
Credits: Image by storyset