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 |
现在我们不仅可以看到每个部门的员工数量,还能看到他们分布在不同的职位上。就像我们的图书馆按流派和作者来组织!
在 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 |
现在,我们的结果按部门整洁地排列,每个部门内部按员工数量降序排列。
在 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