MySQL - GROUP BY 子句:初學者指南
你好,未來的數據庫大師!今天,我們將踏上一段令人興奮的旅程,探索 MySQL 的 GROUP BY 子句。別擔心如果你之前從未寫過一行代碼——我將成為你親切的導遊,我們會一步步來。在這個教程結束時,你將能像專業人士一樣對數據進行分組!
什麼是 MySQL GROUP BY 子句?
想像你正在組織一座巨大的圖書館。你不會把所有書都扔在一個書架上,對吧?你會按照類型、作者或出版年份將它們分組。GROUP BY 子句對我們的數據做的正是這樣的事情——它幫助我們以有意義的方式組織和總結信息。
GROUP BY 子句在 SQL 查詢中用於將具有指定列中相同值的行分組。它通常與聚合函數(如 COUNT()、MAX()、MIN()、SUM()、AVG())一起使用,對每組行進行計算。
讓我們來看一些範例,實際看看這是如何工作的!
在單列上使用 MySQL GROUP BY
我們從一個簡單的範例開始。想像我們有一個名為 employees
的表,其中包含 employee_id
、name
、department
和 salary
列。我們想知道每個部門有多少名員工。
這樣做:
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
這個查詢會給我們以下結果:
department | employee_count |
---|---|
Sales | 10 |
Marketing | 5 |
IT | 8 |
讓我們分解一下這裡發生了什麼:
- 我們 SELECT
department
列並使用 COUNT(*) 函數計算行數。 - 我們用
AS employee_count
給計數取一個友好的名稱。 - GROUP BY 子句按
department
分組結果。
結果向我們展示了每個部門有多少名員工。很酷,對吧?
在多列上使用 MySQL GROUP BY
現在,讓我們升級一個等級。如果我們想按多於一列進行分組呢?沒問題!讓我們說我們的 employees
表還有一個 job_title
列,我們想知道每個部門中每個職位有多少名員工。
這樣做:
SELECT department, job_title, COUNT(*) AS employee_count
FROM employees
GROUP BY department, job_title;
這可能會給我們以下結果:
department | job_title | employee_count |
---|---|---|
Sales | Sales Rep | 8 |
Sales | Sales Manager | 2 |
Marketing | Content Writer | 3 |
Marketing | SEO Specialist | 2 |
IT | Developer | 6 |
IT | IT Manager | 2 |
現在,我們不僅可以看到每個部門有多少名員工,還可以看到他們在不同職位上的分佈。這就像是我們的圖書館按類型組織,然後按作者組織!
MySQL GROUP BY 與 ORDER BY 子句
通常,我們希望我們的分組結果按特定順序排列。這時 ORDER BY 子句就派上用場了。讓我們將之前的結果按部門和員工數量降序排列:
SELECT department, job_title, COUNT(*) AS employee_count
FROM employees
GROUP BY department, job_title
ORDER BY department, employee_count DESC;
這將給我們:
department | job_title | employee_count |
---|---|---|
IT | Developer | 6 |
IT | IT Manager | 2 |
Marketing | Content Writer | 3 |
Marketing | SEO Specialist | 2 |
Sales | Sales Rep | 8 |
Sales | Sales Manager | 2 |
現在,我們的結果按部門整齊地排列,而在每個部門內,職位則按員工數量降序排列。
MySQL GROUP BY 與 HAVING 子句
有時,我們想過濾我們的分組結果。我們可以使用 WHERE 子句,但它會在分組之前過濾行。如果我們想過濾組本身呢?這時 HAVING 子句就派上用場了。
讓我們說我們只想看到員工數量超過 5 人的部門:
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department
HAVING employee_count > 5;
這可能會給我們以下結果:
department | employee_count |
---|---|
Sales | 10 |
IT | 8 |
HAVING 子句過濾掉了只有 5 名員工的 Marketing 部門。
使用客戶端程序使用 GROUP BY 子句
現在,讓我們將所有這些知識用到實際中,使用 MySQL 客戶端程序。我會使用 MySQL 命令行客戶端作為範例,但這些原則對任何 MySQL 客戶端都適用。
首先,我們創建我們的 employees
表並插入一些數據:
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50),
job_title VARCHAR(50),
salary DECIMAL(10, 2)
);
INSERT INTO employees VALUES
(1, 'John Doe', 'Sales', 'Sales Rep', 50000),
(2, 'Jane Smith', 'Marketing', 'Content Writer', 55000),
(3, 'Bob Johnson', 'IT', 'Developer', 65000),
(4, 'Alice Brown', 'Sales', 'Sales Manager', 70000),
(5, 'Charlie Davis', 'IT', 'IT Manager', 75000);
現在,我們運行一個結合我們所學的查詢:
SELECT department, job_title, AVG(salary) AS avg_salary, COUNT(*) AS employee_count
FROM employees
GROUP BY department, job_title
HAVING avg_salary > 60000
ORDER BY avg_salary DESC;
這個查詢:
- 按部門和職位對員工進行分組
- 計算每組的平均薪資和員工數量
- 只顯示平均薪資超過 60,000 美元的組
- 按平均薪資降序排列結果
結果可能如下:
department | job_title | avg_salary | employee_count |
---|---|---|---|
IT | IT Manager | 75000.00 | 1 |
Sales | Sales Manager | 70000.00 | 1 |
IT | Developer | 65000.00 | 1 |
至此,我們從 GROUP BY 的基礎知識一路學習到與其他子句結合的強大數據分析。記住,熟能生巧。嘗試編寫你自己的查詢,嘗試不同的組合,很快你就能像資深數據庫管理員一樣對數據進行分組了!
快樂查詢,願你的數據總是井井有條!
Credits: Image by storyset