一步一步学MySQL----12 分组数据查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013003827/article/details/68132251

12.1 简单分组查询

语法:

select function() from table_name where condition group by field;

例如:

mysql> select * from employee group by depno; //按照部门号进行分组

这里写图片描述

执行结果只显示三条数据,原因是表employee中的字段depno的值只有14,10,12三种,首先将所有数据按这三个值分成三组,然后再显示每组中的一条记录。

那么,如果所针对的字段没有重复值将会发生什么情况呢?

下面我们根据员工号(不重复)进行分组看一看

mysql> select * from employee group by empno;

这里写图片描述

我们看到的执行结果是显示所有数据记录。

12.2 实现统计功能分组查询

如果想显示每个分组中的字段,可以通过group_concat()来实现,该函数可以实现显示每个分组中指定字段值。
语法:

select group_concat(field) from table_name where condition group by field;

例如:要求按照部门号对所有员工进行分组,同时显示每组中的员工姓名和每组中员工的个数。

mysql> select depno, group_concat(ename) names from employee group by depno;
//该语句以关键字depno为分组依据,同时通过函数group_concat()获取每组中所指定参数的记录元素。

这里写图片描述

执行结果显示:分为三组,字段depno为10的记录为一组,depno为12的记录为一组,depno为14的记录为一组,同时通过函数group_concat()显示出了每组中的员工的姓名。

mysql>select depno, group_concat(ename) names, count(ename) num from employee group by depno;

这里写图片描述

执行结果显示:分为三组,同时通过函数group_concat()显示出了每组中员工的姓名,同时通过函数count()统计每组中员工的人数。

12.3 实现多个字段分组查询

例如:要求首先按照部门号对所有员工进行分组,然后按照雇佣日期对每组进行分组,同时显示每组中的员工姓名和员工人数。

mysql> select depno, Hiredate, group_concat(ename) names, count(ename) num from employee group by depno, Hiredate;

这里写图片描述

执行结果显示:分成了8组,同时还通过函数group_concat()和count()显示了每组中员工的姓名和人数。

12.4 实现HAVING子句限定分组查询

注意:在MySQL中,如果想实现对分组进行条件限制,决不能通过关键字where来实现,因为where关键字主要用来实现条件限制数据记录。

为了解决上述问题,MySQL专门提供了关键字Having来实现条件限制分组数据记录。

例如:要求首先按照部门号对所有员工进行分组,然后显示平均工资高于3700的员工的姓名。

第一步:按照部门分组

mysql> select depno from employee group by depno;

这里写图片描述

第二步:显示每组的平均工资

mysql> select depno, avg(salary) from employee group by depno;

这里写图片描述

第三步:执行having、group_concat()和count(),显示出平均工资大于3700的每个分组中员工姓名和人数

mysql> select depno, avg(salary), group_concat(ename) names, count(ename) num from employee group by depno having avg(salary)>3700;

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u013003827/article/details/68132251