SQL

多表查询

分组统计

● 分组统计

  • 分组统计需要使用 GROUP BY 来分组
  • 语法:
SELECT * |列名 FROM 表名 {WEHRE 查询条件}   {GROUP BY 分组字段,分组字段1,...} ORDER BY 列名1 ASC|DESC,列名2...ASC|DESC

范例:部门人数大于 5 人的部门

  • 分析:需要给 count(ename) 加条件,此时在本查询中不能使用 where,可以使用 HAVING。
  • 示例图:
    oracle(19)_SQL_多表联合查询_分组统计(下)_分组统计

范例:查询出部门平均工资大于 2000 的部门

  • 示例图:
    oracle(19)_SQL_多表联合查询_分组统计(下)_字段_02

范例:显示非销售人员工作名称以及从事同一工作的员工的月工资的总和,并且要满足从事同一工作月工资总和大于 5000,结果按月工资总和的升序排列。

  • 分析:
    1、查询出非销售人员
    2、以步骤1为基础按着工作分组求工资的总和
    3、以步骤2为基础查询出月工资总和大于5000的工作
    4、按着月工资的总和的升序排列
  • 示例图:
    oracle(19)_SQL_多表联合查询_分组统计(下)_升序_03
    注意:只有分组条件在结果集中是重复的分组才有意义。

以上操作完整源码:

--部门人数大于 5 人的部门
select count(*) empnum, d.deptno, d.dname, d.loc
  from emp e, dept d
 where e.deptno = d.deptno
 group by d.deptno, d.dname, d.loc
having count(*) > 5;

--查询出部门平均工资大于 2000 的部门
select avg(sal), deptno
  from emp
 group by deptno
having avg(sal) > 2000

--显示非销售人员工作名称以及从事同一工作的员工的月工资的总和,
--并且要满足从事同一工作月工资总和大于5000,结果按月工资总和的升序排列。
select sum(e.sal), e.job
  from emp e
 where e.job <> 'SALESMAN'
 group by e.job
having sum(e.sal) > 5000
 order by sum(e.sal) asc

如有错误,欢迎指正!