我们已经在前面两部分中介绍到了SQL中的单表查询与多表查询的问题,今天我们继续来讲解SQL。在实际的应用中,我们可能会遇到这样的一种情形:假设你有一张员工表,员工表中有学生的籍贯信息,你的BOSS想让你统计一下来自哪些省份的员工比较多。面对这样一个问题,你该怎么做呢?这样的问题,就需要用到SQL中的分组聚合操作了。今天,我们就来讲解几道sqlbolt中的分组聚合操作的习题。本人初学SQL,对SQL了解不深,有错误,还请各位大神赐教。
话不多说,我们直接讲题,我们还是先把表和问题展示出来:


- 问题一:找到这个工作室中,工龄最长的员工的工作时长。这一道题,其实并不涉及分组聚合操作,我们直接给出答案:
select Years_employed
from Employees
order by Years_employed desc
limit 1
- 问题二:找到每一份工作的员工的平均年限。这一个题,涉及到了分组聚合操作,SQL语句如下所示:
select role,avg(Years_employed)
from Employees
group by role
分组聚合操作的命令是group by,同时在这个例子我们还用到了avg这个统计指标。在进行分组聚合操作的时候,select中要紧跟着分组聚合的标准(例如本例中的role)。此外,在进行分组聚合操作的时间,我们需要用到一些统计指标,常见的统计指标有以下五个:
- count:计数指标
- avg:返回平均值
- min:返回最小值
- max:返回最大值
- sum:进行求和
- 问题三:统计每栋大楼中,员工的工作总时长。SQL语句如下:
select Building,sum(Years_employed)
from Employees
group by Building
好了,第一阶段的习题,我们就讲解到这里了,为了方便大家练习,我附上这三道练习题的链接:
SQL Lesson 10: Queries with aggregates (Pt. 1)sqlbolt.com前面的讲解,我们只是介绍了第一部分。在日常工作中,我们有可能还需要在分组聚合之后,进行筛选,面对这样一种全新的需求,我们该怎么做呢?我们下面,就简单介绍一些:
还是先展示表与问题:


- 问题一:查找工作室中有多少位艺术家(不要使用having语句)。根据题目的要求,我们可以知道,这道题即可以使用having语句,也可以不使用having语句。我们两种操作都会展示一下,首先是不使用having语句:
# 不使用having语句
select count(*)
from Employees
where Role="Artist"
现在,使用having语句:
# 使用having语句
select Role,count(*)
from Employees
group by Role
having Role="Artist"
可见,having是可以在分组聚合之后进行条件筛选的。
- 问题二:找到在这个工作室中,不同岗位各有多少人。SQL语句如下:
select Role,count(*)
from Employees
group by Role
- 问题三:找到所有工程师的工作总时长。很明显,SQL语句可以有两种写法,一种是使用having,另外一种则不使用having。我们都展示一下:
# 使用having语句
select Role,sum(Years_employed)
from Employees
group by Role
having Role="Engineer"
# 不使用having语句
select Role,sum(Years_employed)
from Employees
group by Role
having Role="Engineer"
还是和第一部分一样,我们附上习题的链接:
SQL Lesson 11: Queries with aggregates (Pt. 2)sqlbolt.com今天,我们介绍了SQL中的分组聚合操作,涉及到了group by和having两个操作。好了,今天就介绍到这里了。