表名:testusers,字段记录如图,以前create的直接拿来用,将就一下。(懒即生产力)
一)作用: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;
1. 如果GROUP BY 的列没有索引,产生临时表.
2. 如果GROUP BY时,SELECT的列不止GROUP BY列一个,并且GROUP BY的列不是主键 ,产生临时表.
3. 如果GROUP BY的列有索引,ORDER BY的列没索引.产生临时表.
4. 如果GROUP BY的列和ORDER BY的列不一样,即使都有索引也会产生临时表.
5. 如果GROUP BY或ORDER BY的列不是来自JOIN语句第一个表.会产生临时表.
6. 如果DISTINCT 和 ORDER BY的列没有索引,产生临时表.