SQLite - GROUP BY 子句:解鎖數據聚合的力量

Hello, 有抱負的數據魔法師們!今天,我們將踏上一段令人興奮的旅程,進入 SQLite 的世界,並探索其最強大的功能之一:GROUP BY 子句。作為你們親切的鄰居計算機科學老師,我將指導你們一步一步地進行這次冒險。所以,拿起你的虛擬魔杖(鍵盤),我們一起來深入了解一下吧!

SQLite - GROUP By Clause

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;

這個查詢將給我們每個學院的學生數量。這裡發生了什麼:

  1. 我們選擇 'department' 列,並使用 COUNT(*) 函數計算行數。
  2. 我們按照 'department' 列對結果進行分組。

輸出將會類似這樣:

department student_count
Computer Science 2
Mathematics 2
Physics 1

示例 2:按學院計算平均成績

現在,讓我們計算每個學院的平均成績:

SELECT department, AVG(grade) as average_grade
FROM students
GROUP BY department;

這個查詢將學生按學院分組,並計算每個學院的平均成績。這裡的分解如下:

  1. 我們選擇 'department' 列。
  2. 我們在 'grade' 列上使用 AVG() 函數計算平均值。
  3. 我們按照 '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;

這裡發生了什麼:

  1. WHERE 子句過濾掉了 80 分以下的成績。
  2. 然後,我們按照學院對剩餘的行進行分組。
  3. 最後,我們為每組計算平均成績。

結果可能會像這樣:

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;

這裡的分解如下:

  1. 我們按照學院對學生進行分組。
  2. 我們計算每個學院的平均成績。
  3. 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