groupby详解

一、groupby详解

  • 上周五同组同事有一个关于sql的bug,经leader看完后大体定位在group by语句用法错误。然后leader把我叫上一起,询问我们关于group by的用法。而我当时脑子非常空,其实感觉group by在脑子就只有一种去重的大致概念。真正用的时候其实大概率还是靠度娘,所以久久答不上来,所以特来重新学习下group by语句。

group_by的意思是根据by对数据按照哪个字段进行分组,或者是哪几个字段进行分组。

二、groupby语法

select 字段 from 表名 where 条件 group by 字段

或者

select 字段 from 表名 group by 字段 having 过滤条件

注意:对于过滤条件,可以先用where,再用group by或者是先用group by,再用having(唯一的差别是WHERE过滤行,HAVING过滤组)HAVING支持所有WHERE操作符

三. 案例

1 、创建表格并插入数据
说明:在navicat上创建表格并插入数据,以便下面进行简单字段分组以及多个字段分组,同时还结合聚合函数进行运算。

创建student表

 CREATE TABLE `student`  (
  `id` bigint(20) NOT NULL COMMENT '主键',
  `name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名',
  `grade` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '年级',
  `salary` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '薪水',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

在student表中插入数据

  insert into student values(1,'zhangsan','A',1500);
  insert into student values(2,'lisi','B',3000);
  insert into student values(1,'zhangsan','A',1500);
  insert into student values(4,'qianwu','A',3500);
  insert into student values(3,'zhaoliu','C',2000);
  insert into student values(1,'huyifei','D',2500);

数据插入到student表中的结果

在这里插入图片描述
2 、单个字段分组
① select grade from student 查出所有学生等级(包括重复的等级)
在这里插入图片描述
② select grade from student group by grade 查出学生等级的种类(按照等级划分,去除重复的
在这里插入图片描述
3 、多个字段分组
select name , sum(salary) from student group by name , grade (按照名字和等级划分,查看相同名字下的工资总和
注意:这里有一点需要说明一下,多个字段进行分组时,需要将name和grade看成一个整体只要是name和grade相同的可以分成一组;如果只是name相同,grade不同就不是一组
在这里插入图片描述

  • 那么比方我对上面的grade进行分组,但是相同grade有多个数据,对应不同的Id,那么它会如何显示呢,其实并不会报错,而是仍然可以查出来,只是这时候查出来的grade的数据是对应最早(分组后最上面)放进数据库的数据。那么如果我们想分组后输出我们想要的那一条数据该怎么办呢?
  • 答案就是用聚合函数,聚合函数就用来输入多个数据,输出一个数据的。如cout(id),sum(number),而每个聚合函数的输入就是每一个多数据的单元格。
  • 常用的聚合函数:count() , sum() , avg() , max() , min()

count():计数

select  name , count(*)  from  student   group  by  name    #查看表中相同人名的个数

得出的如下结果
在这里插入图片描述

  • sum():求和
 #查看表中人员的工资和(同名的工资相加)
select  name , sum(salary)   from   student   group  by   name     

在这里插入图片描述

avg():平均数

#查看表中人员的工资平均数(同姓工资平均数)
select  name , avg(salary)   from  student   group  by  name  , grade       

得出的如下结果
在这里插入图片描述

max():最大值

#查看按等级划分人员工资最大值
select   grade , max(salary)   from   student   group  by   grade           

得出的如下结果
在这里插入图片描述

min():最小值

#查看按等级划分人员工资最小值
select   grade , min(salary)   from   student   group  by   grade        

得出的如下结果
在这里插入图片描述

  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨~旋律

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值