SQL中的分组函数与分组查询

语法

  1. select [distinct] * | 列名1,列名2..., 列名n , 组函数(...)
  2. from 表名1,表名2...
  3. [where 条件][group by 列名1,列名2... ]
  4. [having 条件][order by 排序列名1 ASC | DESC , 排序列名2 ASC | DESC...]

分组函数

  • count(): 统计的是非null的个数
  • sum() :记录的总和
  • avg():平均值
  • max():最大值
  • min():最小值

1. 查询出所有员工的个数

  1. select count(empno)
  2. from emp
  3. select count(comm)
  4. from emp

2. 查询出所有员工的总薪资

  1. select sum(salary)
  2. from emp

3. 查询出所有员工的平均薪资

  1. select avg(salary)
  2. from emp

4. 查询出所有员工的最大薪资

  1. select max(salary)
  2. from emp

5. 查询出所有员工的最小薪资

  1. select min(salary)
  2. from emp

6. 统计各职位的员工个数

  1. select job 职位, count(empno) 人数
  2. from emp
  3. group by job -- 按照job 分组

7. 统计各部门的员工个数,根据部门编号升序排序

  1. select deptno ,count(empno)
  2. from emp
  3. group by deptno
  4. order by deptno

8. 统计各部门各职位的员工人数,根据部门编号升序排序,部门编号相同,则按照职位的字母先后顺序排序

  1. 部门编号 职位 人数
  2. 10 clerk 9
  3. 10 manager 3
  4. 10 others 2
  5. 20 clerk 5
  6. 20 manager 6
  7. 20 others 1
  8. select deptno 部门编号, job 职位,count(empno) 人数
  9. from emp
  10. group by deptno,job
  11. order by deptno,job

9. 统计10部门的各职位的员工人数(显示部门编号,职位名称,员工人数)

  1. 部门编号 职位 人数
  2. 10 员工 9
  3. 10 经理 3
  4. 10 主管 2
  5. select deptno 部门编号, job 职位,count(empno) 人数
  6. from emp
  7. where deptno=10
  8. group by job

10. 查询10部门的各职位的员工人数大于2的职位信息(显示部门编号,职位名称,员工人数)

  1. 部门编号 职位 人数
  2. 10 员工 9
  3. 10 经理 3
  4. [10 主管 2 ---过滤出去]
  1. select deptno 部门编号, job 职位,count(empno) 人数
  2. from emp
  3. where deptno=10
  4. group by job
  5. having count(empno) >2

group by 分组使用注意事项:

  • (1)select 单列, 组函数 from … 【错误】,一定要与group by 使用

where 与 having 的区别:

  • (1)where 是分组之前的要过滤的条件,where后面不能与组函数一起使用 【where 与分组无关】
  • (2)having 是分组之后的结果之上再做的过滤,having可以与组函数一起使用【having 与分组一起使用】

课堂练习

  1. 分组函数:
  2. count() : 总个数
  3. sum(): 总和
  4. avg(): 平均值
  5. max(): 最大值
  6. min(): 最小值
  7. -- 1.查询所有员工人数
  8. select count(empno) from emp
  9. -- 2.查询所有员工总薪资
  10. select sum(salary) from emp
  11. -- 3.查询所有员工平均薪资
  12. select avg(salary) from emp
  13. -- 4.查询所有员工的最高薪资
  14. select max(salary) from emp
  15. -- 5.查询所有员工最低工资
  16. select min(salary) from emp
  17. -- 6. 查询出20部门的最高薪资
  18. select max(salary)
  19. from emp
  20. where deptno = 20
  21. -- 7.查询出职位是'CLERK'部门的平均薪资
  22. select avg(salary) from emp where job = 'CLERK'
  23. -- 8.查询出30部门的员工人数
  24. select count(empno)from emp where deptno = 30
  25. -- 9.查询出1020部门的总薪资
  26. select sum(salary)from emp where deptno = 10 or deptno =20
  27. -- -----------------分组查询 group by -----------------
  28. -- 10.查询出每个部门的人数
  29. select deptno ,count(empno)
  30. from emp
  31. group by deptno
  32. -- 12. 查询出各职位的平均薪资,按照薪资降序排序
  33. select job ,avg(salary)
  34. from emp
  35. group by job
  36. order by avg(salary) desc
  37. -- 13. 查询出各部门的最高薪资值
  38. select job ,max(salary)
  39. from emp
  40. group by job
  41. -- 14. 查询出各职位的薪资总和
  42. select job ,sum(salary)
  43. from emp
  44. group by job
  45. -- 15. 查询出各部门各职位的员工人数
  46. select deptno,job ,count(empno)
  47. from emp
  48. group by deptno,job
  49. order by count(empno) asc
  50. -- 14. 查询出各部门薪资2000的员工个数
  51. select deptno,count(empno)
  52. from emp
  53. where salary > 2000
  54. group by deptno
  55. -- =======================having 使用=================
  56. having + group by :分组之后进行的条件过滤
  57. -- 15. 查询出各部门员工个数超过3的部门编号,人数
  58. select deptno,count(empno)
  59. from emp
  60. group by deptno
  61. -- 分组之后的筛选
  62. having count(empno) >3