SQL - 分组子句(GROUP BY Clause)

你好啊,未来的SQL大师们!今天,我们将深入探讨我们SQL工具箱中最强大的工具之一:GROUP BY子句。作为你友好的计算机老师邻居,我将在这一旅程中一步步引导你。所以,拿起你最喜欢的饮料,舒服地坐好,让我们一起踏上这个激动人心的SQL冒险之旅!

SQL - Group By Clause

SQL GROUP BY子句

想象一下你正在组织一个庞大的图书馆。书籍散落在各处,你想按类型将它们排列整齐。这就是SQL中的GROUP BY子句所做的——它帮助我们整齐、逻辑地组织数据。

GROUP BY子句用于将具有指定列相同值的行分组。它通常与聚合函数一起使用,对每组行执行计算。

让我们从一个简单的例子开始:

SELECT department, COUNT(*) as employee_count
FROM employees
GROUP BY department;

在这个查询中,我们按照部门对员工进行分组,并计算每个部门有多少员工。就像在问:“我们在每个类型中有多少本书?”

GROUP BY子句与聚合函数

现在,让我们来点刺激的。当我们将GROUP BY与聚合函数结合使用时,它才能真正发光。这些函数对一组值进行计算,并返回单个结果。一些常见的聚合函数包括COUNT()、SUM()、AVG()、MAX()和MIN()。

下面是这些函数及其用法的表格:

函数 描述
COUNT() 计算行数
SUM() 计算一组值的总和
AVG() 计算一组值的平均值
MAX() 返回一组中的最大值
MIN() 返回一组中的最小值

让我们看看这些函数的实际应用:

SELECT department,
COUNT(*) as employee_count,
AVG(salary) as avg_salary,
MAX(salary) as max_salary,
MIN(salary) as min_salary
FROM employees
GROUP BY department;

这个查询为我们提供了每个部门的丰富信息:员工数量、平均工资、最高工资和最低工资。就像对我们图书馆中的每个类型进行全面的报告!

GROUP BY子句在单个列上

有时,我们只想关注数据的一个方面。假设我们想知道每个职位有多少员工:

SELECT job_title, COUNT(*) as employee_count
FROM employees
GROUP BY job_title;

这个查询按照职位对员工进行分组,并计算每个职位的人数。就像计算我们图书馆中有多少本悬疑小说、浪漫小说和科幻小说。

GROUP BY子句在多个列上

但为什么只停在单个列上?我们可以通过多个列进行分组,以获得更具体的信息。让我们按部门和职位对员工进行分组:

SELECT department, job_title, COUNT(*) as employee_count
FROM employees
GROUP BY department, job_title;

这个查询告诉我们每个部门中每个职位有多少员工。就像首先按类型组织我们的书籍,然后在每个类型内按作者组织。

GROUP BY与ORDER BY子句

现在,让我们给我们的结果添加一些顺序。ORDER BY子句帮助我们排序分组数据:

SELECT department, COUNT(*) as employee_count
FROM employees
GROUP BY department
ORDER BY employee_count DESC;

这个查询按部门对员工进行分组,计数,然后按员工数量降序排列结果。我们会首先看到员工数量最多的部门。就像按书籍类型的数量从多到少排列我们的书架。

GROUP BY与HAVING子句

最后但同样重要的是,让我们来谈谈HAVING子句。WHERE子句在分组之前过滤行,而HAVING子句过滤分组本身。就像说:“只显示拥有超过100本书的类型。”

SELECT department, COUNT(*) as employee_count
FROM employees
GROUP BY department
HAVING employee_count > 50;

这个查询只显示员工数量超过50个的部门。这是一种聚焦于较大部门或在我们图书馆的比喻中,更受欢迎的类型的绝佳方式。

好了,伙计们!我们已经穿越了GROUP BY的土地,从基本用法到带有多个列、ORDER BY和HAVING子句的更复杂应用。记住,熟能生巧,所以不要害怕在你自己的数据集上尝试这些查询。

SQL一开始可能看起来很吓人,但随着时间和练习,你将像专业人士一样分组和聚合数据。谁知道呢?你甚至可能开始用分组和聚合的方式看待世界!(只是别在聚会上尝试对朋友进行GROUP BY——相信我,结果不会太好。)

继续编码,继续学习,最重要的是,继续在SQL中找到乐趣!

Credits: Image by storyset