1、单字段分组查询(group by)
1.1、查询出每个部门的人数:
SELECT
字段名 AS '部门编号',
COUNT(字段名) AS '人数'
FROM
表名
GROUP BY
字段名
1.2查询每个部门的部门名称、部门人数、平均工资 :
分析:
由于要统计部门名称所以要和部门表进行关联,既然要统计部门就要以部门表为主,所以要右连接,在算平均值的可能会出现小数点多的情况,所以用了round函数保留了两位小数,由于40部门下没有人,也就没有平均工资所以会出现空的情况,用IFUNLL函数,如果为空显示0;
SELECT
d.DNAME AS '部门名称',
COUNT(e.DEPTNO) AS '部门人数',
IFNULL(ROUND(AVG(e.SAL),2),0) AS '平均工资'
FROM
emp e -- 员工表
RIGHT JOIN
dept d -- 部门表
ON(e.DEPTNO = d.DEPTNO)
GROUP BY
e.DEPTNO;
2、多字段分组查询:
2.1查询每个部门的部门编号、部门名称、部门人数,平均工资:
SELECT
d.DEPTNO AS '部门编号',
d.DNAME AS '部门名称',
COUNT(e.DEPTNO) AS '部门人数',
IFNULL(ROUND(AVG(e.SAL),2),0) AS '平均工资'
FROM
emp e
RIGHT JOIN
dept d
ON(e.DEPTNO = d.DEPTNO)
GROUP BY
e.DEPTNO,d.DEPTNO;
3、HAVING:
在很多时候往往需要对分组之后的数据进行再次过滤,例如:要求部门人数超过5个人的部门信息,这样的操作首先要按照部门进行分组统计,而后子通过统计结果进行数据过滤,想要实现这样的功能,只能通过HAVING语句来完成。
having一般和group一起使用,分组后的两次筛选
3.1、查询出所有平均工资大于2000的部门信息、平均工资、员工人数。
SELECT
JOB AS '职位',
AVG(SAL) AS '平均工资',
COUNT(JOB) AS '员工人数'
FROM
emp
GROUP BY
JOB
HAVING
AVG(SAL) > 2000;
3.2求出部门人数大于2人的部门,要求显示部门名称、部门编号、部门人数。
分析:先找出人数大于2人的部门。再按照要求显示:
SELECT
d.DNAME AS '部门名称',
d.DEPTNO AS '部门编号',
COUNT(e.DEPTNO) AS '部门人数'
FROM
emp e
RIGHT JOIN dept d ON (e.DEPTNO = d.DEPTNO)
GROUP BY
d.DEPTNO
HAVING COUNT(e.DEPTNO);