MySQL GROUP BY 语句使用总结

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

MySQL GROUP BY 语句使用总结

大家好,我是Yangrl.
总结一下MySQL中查询记录操作中的GROUP BY语句,查遗补漏。
表名:testusers,字段记录如图,以前create的直接拿来用,将就一下。(懒即生产力)

命令行工具:cmder


一)作用:GROUP BY 语句根据一个或多个列对结果集进行分组。会把值相同放到一个组中,最终查询出的结果只会显示组中一条记录。(字母不好理解没关系,看下面的例子秒懂)

二)example:
1)基本用法:
根据 sex 字段分组,查询用户名、年龄、电话、性别。
这就分组成功了!男的一组 女的一组,还有一组那啥,咳咳,搞不清楚的,但是都只显示了组中一条记录,我们的效果不够明显,接着看下面的例子。)

SELECT `username`,`age`,`tel`,`sex` FROM testusers GROUP BY `sex`;

这里写图片描述

2)GROUP BY 语句中的GROUP_CONCAT()函数
根据sex 字段进行分组并查看username字段和age字段的详细信息。(这下对基本用法就很好理解了。因为他默认只显示了组中一条记录,如果想看组内所以的用户信息,就需要用到GROUP_CONCAT()函数。接着往下↓)

SELECT GROUP_CONCAT(username),GROUP_CONCAT(age),sex FROM testusers GROUP BY sex

3)COUNT()函数:统计记录总数
根据sex 字段分组,查询性别和用户名,年龄的详细信息并统计各组用户数量。
(查出来记录以后自己数?太萌了吧?利用COUNT()函数统计记录总数。当然细心的兄dei已经发现问题了,为什么只有三个男的,COUNT()函数统计出来四个?[难道有两根?!] ,咳咳,是因为在COUNT()函数中,写COUNT(*)会统计我们表中的NULL值,如果不想统计NULL值,请写COUNT(字段名)。看我们上面的表中,最后一条记录的username是NULL,所以只有三个男的却统计出四根diao.呸,统计出四个男生。PS:代码段中AS xxx=取别名)

SELECT COUNT(*) AS totalUsers, GROUP_CONCAT(username) AS userDetail ,GROUP_CONCAT(age) AS userAge,sex FROM testusers GROUP BY sex;

4)加WHERE条件
在年龄大于等于18的范围内,根据sex分组,查询性别和用户名、年龄的详细信息并统计各组用户数量(就是在上条基础上加了WHERE条件,”未满18岁,禁止观看!”)
这里写图片描述

5)聚合函数[‘SUM()求和函数’,’MAX()函数:求最大值’,’MIN()函数:求最小值’,’AVG()函数:求平均值’]。一个例子整合运用(计算每组用户薪水的各项值)。

SELECT COUNT(*) AS totalUsers,GROUP_CONCAT(username) AS userDetail,sex,SUM(salary) AS sum_salary,MAX(salary) AS max_salary,MAX(salary) AS max_salary,MIN(salary) AS min_salary,AVG(salary) AS avg_salary FROM testusers GROUP BY sex;

6):HAVING 子句:对分组结果进行二次筛选
根据性别分组,查询性别和用户名,年龄的详细信息并统计各组用户总数,得出结果后进行二次筛选出用户总数在5人及以上的组。相当于WHERE是一次筛选,HAVING是在二/再次筛选.

 SELECT COUNT(*) AS totalUsers,GROUP_CONCAT(age) AS userAge,GROUP_CONCAT(username) AS userDetail,sex FROM testusers GROUP BY sex HAVING totalUsers>=5;

这里写图片描述

7)WITH ROLLUP子句:
可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)
也就是说,当我们进行分组操作以后,又想再看总的信息,或者还有其他类似操作,普通GROUP BY语句是不能实现的,就需要用到有 WITH ROLLUP 子句的 GROUP BY语句
再肤浅一点,就是会在记录末尾添加一条记录,是上面所有记录的总和。

SELECT coalesce(sex,"总数"),COUNT(*) AS totalUsers,GROUP_CONCAT(age) AS userAge,GROUP_CONCAT(username) AS userDetail FROM testusers GROUP BY sex WITH ROLLUP;

with rollup

总结确实需要时间,还以为十几分钟就写得完。不过还是划得来,如果您发现了我的错误或者有更好更优化的方法请在下面评论区分享,非常感谢您呢!(不接受批评[高傲.png])


我对自己的要求很低:我活在世上,无非想要明白些道理,遇见些有趣的事。倘能如我愿,我的一生就算成功。——王小波

猜你喜欢

转载自blog.csdn.net/YAruli/article/details/79239859