SQL基础7--分组相关(GROUP BY 和 HAVING)

目录

1、创建分组GROUP BY

2、分组过滤 HAVING

3、where+having过滤数据

4、多个函数加分组运算


参考数据表名:person
id  name age
1 atom 111
2 atom2 22
3 atom3 33
4 atom 22
5 atom 33
6 atom2 33

1、创建分组GROUP BY

如果我要统计,person表中同姓名的各有多少人应该怎么计算呢?

这时候就要用到分组函数 group by了,在表达式中,select后的查询条件一定要与group by的分组条件保持一致(不包括聚合函数)

SELECT name,count(*) as many from person GROUP BY name

先在person表中,对name进行分组,然后在查询不同姓名的人数是多少

2、分组过滤 HAVING

如果我们查询表中每个重名的人的个数应该怎么查呢?

这时候就需要用到HAVING了

HAVING和WHERE都是用来过滤,但是区别是什么呢?

(1)where是用例过滤行的,having是用来过滤分组的

(2)having一般跟在group by子句后

(3)where是在分组前进行过滤,而having是在分组后进行过滤的

SELECT name,count(*) as many from person group by name HAVING count(*) >=2

在person表中先对name进行分组,然后过滤每个组姓名>=2的数量,之后在搜索name并展示出来

3、where+having过滤数据

如果我们要搜索年龄小于100岁的且重名的人的个数?

这时候我们就需要用到where了,sql会先对where进行过滤数据,过滤完之后在进行分组和对组过滤。

SELECT name,count(*) as many from person where age < 100 group by name HAVING count(*) >=2 

先过滤出年龄小于100的数据,然后对姓名进行分组,再然后对组进行过滤出大于等于2的数据 

4、多个函数加分组运算

如果要计算出每个重名的人的平均年龄、最大年龄、最小年龄应该怎么查询?

这样的话就需要用的AVG(),MAX(),MIN()了

SELECT name,count(*),MAX(age),MIN(age),AVG(age)  from person group by name HAVING count(*) >=2 

tip:一般题目中有“每”就需要用到分组了,比如:每个部门的平均奖金、每个部门的最高工资、每个班的平均成绩 

可扫描二维码关注公众号:刘阿童木的进化记录     大家一起学习进步

Guess you like

Origin blog.csdn.net/weixin_42893232/article/details/120778672