Mysql Group by函数用法详解

应用场景:

现有表student如下:
在这里插入图片描述

需求描述:

需要查询1班的人数:

使用语句:

SELECT count(*) from student where class_name ='1班';

结果显示:
在这里插入图片描述


同时显示各个班级的总人数

上面的命令只能显示1个班级的总人数
但如果需要同时显示各个班级的总人数,则需要用到group by指令:

 select count(*) from student GROUP BY class_id; 

结果显示:在这里插入图片描述
加入class_id的显示更便于观察:

select class_id,count(*) from student GROUP BY class_id; 

结果显示:
在这里插入图片描述

同时显示class_id、class_name、以及班级总人数

SELECT class_id,class_name,count(*) from from student GROUP BY class_id; 

我们想当然的这样写了,但是输入mysql,发现报错了

SELECT class_id,class_name,count(*) from from student GROUP BY class_id;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘from student GROUP BY class_id’ at line 1

这里在select后面有class_id,class_name但是在group by后面只接了class_id;
正确的语句应当将select中的所有列都作为分组的条件
正确语句为:

 select class_id,class_name,count(*) from student GROUP BY class_id,class_name;

结果显示:
在这里插入图片描述

特殊情况分析1

还是对上面这个表进行操作

 SELECT class_id,class_name,student_name from  student GROUP BY student_name;

发现没有报错…结果如下:
在这里插入图片描述
聪明的同学可能已经发现问题了,上面不是说在对多列数据进行分组时,“应当将select中的所有列都作为分组的条件”
吗?那这边为什么不用呢?

经过本人的多次测试,发现如果在GROUP BY后面接的是这个表的主键,那么不管SELECT后面接多少东西都是无所谓的(只能是当前表的内容)。

特殊情况分析2

接着上面的情况分析,我们知道,在一个表中,主键字段下的元素是不重复的,那么是不是只要是不重复的元素,就可以拥有特殊情况1中的特性呢?即不管SELECT后面接多少东西都是无所谓的,下面进行测试。
我们新建了一个表,student_copy1如下:
在这里插入图片描述
该表的主键依旧是student_name,这时我们对非主键字段class_id进行分组:

 SELECT class_id,class_name,student_name from  student_copy1 GROUP BY class_id;

显示报错:
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘chuange.student.class_name’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

说明这样是行不通的,只有对主键元素进行分组我们才能为所欲为- -

对于两个表,也可以使用GROUP BY

举个例子:
现在有表orders:
在这里插入图片描述
以及表customers:
在这里插入图片描述
现在对这两个表进行操作:

select customers.cust_name,customers.cust_id ,count(orders.order_num)
from customers LEFT JOIN orders ON customers.cust_id = orders.cust_id
group by customers.cust_id;

结果显示:
在这里插入图片描述

GROUP BY原理分析:

对于本文中的student表:
在这里插入图片描述
我们按照class_id进行分组,可以分为如下三组,如表所示:
在这里插入图片描述
在对Class_id进行分组的时候,可以看到有三组Class_id,每一组对应的其他内容都加起来大于3,所以说如果用这个代码显示的话就会报错:

 SELECT class_id,class_name,student_name from  student GROUP BY class_id;

但是我们可以用聚集函数将这些“其他内容”聚集起来显示:
比如

SELECT class_id,COUNT(*),SUM(student_name) from  student GROUP BY class_id;

结果显示:
在这里插入图片描述
这里的COUNT(*)指的每一组元素的总个数.

解决方案:

提示:这里填写该问题的具体解决方案:
例如:新建一个 Message 对象,并将读取到的数据存入 Message,然后 mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();换成 mHandler.sendMessage()。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值