目录
查询每个部门的编号、名称、位置、部门人数、平均工资
多表查询分组统计
子查询分组统计
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
为了解释这种查询的作用,下面做一个简单的查询
查询每个部门的编号、名称、位置、部门人数、平均工资
这个前面已经讲过了
SQL> select d.deptno,d.dname,d.loc,count(*),avg(sal)
2 from emp e,dept d
3 where e.deptno(+)=d.deptno
4 group by d.deptno,d.dname,d.loc;
DEPTNO DNAME LOC COUNT(*) AVG(SAL)
---------- ---------------------------- -------------------------- ---------- ----------
10 ACCOUNTING NEW YORK 3 2916.66667
20 RESEARCH DALLAS 3 2258.33333
30 SALES CHICAGO 6 1566.66667
40 OPERATIONS BOSTON 1
除了以上的方式之外,也可以利用子查询完成
首先 dept 是一张数据表,但是对于数据的统计查询,也可以将查询的结果定义为一张新的表
SQL> select deptno,count(empno),avg(sal)
2 from emp
3 group by deptno;
DEPTNO COUNT(EMPNO) AVG(SAL)
---------- ------------ ----------
30 6 1566.66667
10 3 2916.66667
20 3 2258.33333
此时,查询返回的是一个多行多列的数据,那么只要是多行多列,我们就可以把它看成是一个新的临时表,然后可以在 FROM 子句中使用
SQL> select d.deptno,d.dname,d.loc,temp.count,temp.avg
2 from dept d,(
3 select deptno,count(empno) count,avg(sal) avg
4 from emp
5 group by deptno) temp
6 where d.deptno=temp.deptno(+);
DEPTNO DNAME LOC COUNT AVG
---------- ---------------------------- -------------------------- ---------- ----------
10 ACCOUNTING NEW YORK 3 2916.66667
20 RESEARCH DALLAS 3 2258.33333
30 SALES CHICAGO 6 1566.66667
40 OPERATIONS BOSTON
现在有两种方式可以实现同样功能的查询,那么这两种方式有什么区别呢?
为了更好地解释此类问题,现在假设将数据扩大 10 倍,即此时的 emp 表中有 140 条记录,dept 表中有 40 条记录,现在分析这两种方式
多表查询分组统计
数据量为 emp 表的 1400 * dept 表的 400 = 640000
子查询分组统计
from子句的数据量为 140 行记录,最多会返回 40 行记录。
与 dept 表查询,dept 表的 400 * 最多返回的 400 = 160000。
数据量为分组的 140 行 + 16000 行 = 161400。
多表查询都会存在性能问题,而子查询的主要目的就是为了解决多表查询的性能问题
在子查询的使用中,应注意以下几点。
(1)子查询必须用括号“ () ”扩起来
(2)子查询中不能再包括 order by 子句
(3)如果需要对查询数据进行排序,只能在外查询语句中使用 order by 子句
(4)子查询允许嵌套,但是不能超过 25 层。