分组查询(Group By)

587 阅读2分钟

分组查询将查询结果按一个或多个进行分组,也就是把同一列中,数据相同的分为一组。

假如有学生表student,如图所B示:

使用如下代码,把sex列中相同的数据分到一组,”男“一组,”女“一组。

select sex
from student 
group by sex
  • 结果如图:

如果是学院sdept呢?

select sdept
from student 
group by sdept
  • 结果如图:

不过要注意,Group by 是分组,不是简单去重(distinct),比如我们可以将分组后的数据,配合之前学过函数使用,比如COUNT函数,统计每个学院的所拥有的学生数。

select sdept,count(sdept) as 学生数
from student
group by sdept
  • 结果如图:

Having

having用来筛选数据,比如上题统计每个学院的学生数,我们可以进行筛选,让其只包含学院CS以及学院IS。MA学院的数据则被筛选出去。

select sdept,count(sdept) as 学生数
from student
group by sdept
having sdept in ('CS','IS')
  • 结果如图:

我们再举个例子

下图为选课表sc

1.查询所有学生的所选修课程的平均分

思路:按学号使用Group By 进行分组,分成三组,然后使用AVG函数计算每个分组的平均数值。

select sno,avg(grade) as 平均分
from sc
group by sno
  • 结果如图:

2.查询学号为20001的学生的总分。

思路:按学号使用Group By 进行分组,分成三组,然后使用 having 对三个分组进行筛选,选择学号为 20001 的一组。

select sno,sum(grade) as 总分
from sc
group by sno
having sno = '20001'
  • 结果如图:

Having和Where的区别

  • Having 是用来筛选被 Group By 后的每个分组,而 Where 是用来筛选表中的某几行数据

    比如:where sex = ‘男’,那么查询结果中,sex 属性不是男的那几行数据,会被筛除。

    如图所示:

  • Having 子句可以跟着聚合函数(比如sum函数等叫做聚合函数),而Where 子句 后不可以,比如

    select sno,sum(grade) as 总分
    from sc
    group by sno
    having sum(grade) < 140
    

    结果如图:

  • Having 子句后的列,要么被 Group by 子句包含,要么被聚合函数包含(比如sum),否则便不行,而Where 子句后的列随便,无限制。