针对于班上所有的同学:
分组情况1-按照性别分组:男生一组,女生一组,之后可以统计男生和女生的数量;
分组情况2-按照年龄段分组:80后一组,90后一组;
分组情况3-按照籍贯分组:广东一组,湖南一组,江西一组;
语法:
SELECT [DISTINCT] *|分组字段1 [别名] [,分组字段2 [别名] ,…] | 统计函数
FROM 表名称 [别名], [表名称 [别名] ,…]
[WHERE 条件(s)]
[GROUP BY 分组字段1 [,分组字段2 ,…]]
[ORDER BY 排序字段 ASC | DESC [,排序字段 ASC | DESC]];
注意:
使用GROUP BY子句将表分成小组
组函数忽略空值,可以使用ifnull
结果集隐式按升序排列,如果需要改变排序方式可以使用order by 子句
1,出现在SELECT列表中的字段,如果出现的位置不是在分组函数中,那么必须出现在GROUP BY子句中
2,在GROUP BY 子句中出现的字段,可以不出现在SELECT列表中
3,如果没有GROUP BY子句,SELECT列表中的任何列或表达式不能使用统计函数(单独使用统计函数除外):
分组函数单独使用:
SELECT COUNT(empno) FROM emp;
错误的使用,出现了其他字段:
SELECT empno,COUNT(empno) FROM emp;
正确做法:
SELECT empno,COUNT(empno) FROM emp GROUP BY empno,job;
如果现在要进行分组的话,则SELECT子句之后,只能出现分组的字段和统计函数,其他的字段不能出现:
正确做法:
SELECT job,COUNT(empno),AVG(sal)
FROM emp
GROUP BY job;
错误的做法:
SELECT deptno,job,COUNT(empno),AVG(sal)
FROM emp
GROUP BY job;
正确做法:
SELECT deptno,job,COUNT(empno),AVG(sal)
FROM emp
GROUP BY deptno,job;
在group by 子句中,可以按单列进行分组,也可以在多列上进行分组,多列分组就是按照多个字段的组合进行分组,最终的结果也会按照分组字段进行排序显示。
-- 1,按照职位分组,求出每个职位的最高和最低工资
SELECT MAX(SAL),JOB FROM emp GROUP BY JOB;
-- 2,查询出每一个部门员工的平均工资
SELECT AVG(SAL),DEPTNO FROM emp GROUP BY DEPTNO;
-- 3,查询平均工资高于2000的部门和其平均工资
SELECT AVG(SAL),DEPTNO FROM emp GROUP BY DEPTNO HAVING AVG(SAL) >=2000;
-- 4,查询各个部门和岗位的平均工资
SELECT AVG(SAL),DEPTNO,JOB FROM emp GROUP BY DEPTNO,JOB;
-- 5,查询各个管理人员下员工的平均工资,其中最低工资不能低于1300,不计算老板
SELECT AVG(SAL),DEPTNO,JOB FROM emp GROUP BY job HAVING AVG(SAL) >1300;
-- 6,查询在80,81,82,83年各进公司多少人
SELECT COUNT(*),YEAR(HIREDATE) FROM emp WHERE YEAR(HIREDATE) IN ('1980','1981','1982','1983') GROUP BY YEAR(HIREDATE);