目录
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:一般题目中有“每”就需要用到分组了,比如:每个部门的平均奖金、每个部门的最高工资、每个班的平均成绩
可扫描二维码关注公众号:刘阿童木的进化记录 大家一起学习进步