应用场景:
现有表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()。