目录
在having子句中使用子查询
统计出部门平均工资高于公司平均工资的部门编号、平均工资、部门人数
在select子句中使用子查询
查询每个员工的编号、姓名、职位、部门名称
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
在having子句中使用子查询
如果要使用 having子句,那么必须要结合 group by 子句,而如果要使用 group by 子句,就一定要分组
统计出部门平均工资高于公司平均工资的部门编号、平均工资、部门人数
第一步:根据部门编号分组,统计出每个部门编号的平均工资、部门人数
SQL> select deptno,count(*),avg(sal)
2 from emp
3 group by deptno;
DEPTNO COUNT(*) AVG(SAL)
---------- ---------- ----------
30 6 1566.66667
10 3 2916.66667
20 3 2258.33333
第二步:如果要想知道哪些部门的平均工资高于公司的平均工资,则应该进行 emp 表的统计查询
SQL> select avg(sal) from emp;
AVG(SAL)
----------
2077.08333
此时的子查询返回了单行单列的数据,那么肯定要在 having子句里面使用
第三步:对数据过滤
SQL> select deptno,count(*),avg(sal)
2 from emp
3 group by deptno
4 having avg(sal)>(
5 select avg(sal) from emp);
DEPTNO COUNT(*) AVG(SAL)
---------- ---------- ----------
10 3 2916.66667
20 3 2258.33333
这个可能有点难度哈,需要多加练习
在select子句中使用子查询
首先需要明确的是,这样操作的意义不大,而且效率不高。不过我们也介绍一下它 的使用方法
查询每个员工的编号、姓名、职位、部门名称
按照一般思路,可以使用多表查询,即下面的查询语句
SQL> select e.empno,e.ename,e.job,d.dname
2 from emp e,dept d
3 where e.deptno=d.deptno;
EMPNO ENAME JOB DNAME
---------- -------------------- ------------------ ----------------------------
7839 KING PRESIDENT ACCOUNTING
7782 CLARK MANAGER ACCOUNTING
7934 MILLER CLERK ACCOUNTING
7902 FORD ANALYST RESEARCH
7369 SMITH CLERK RESEARCH
7566 JONES MANAGER RESEARCH
7900 JAMES CLERK SALES
7844 TURNER SALESMAN SALES
7654 MARTIN SALESMAN SALES
7521 WARD SALESMAN SALES
7499 ALLEN SALESMAN SALES
7698 BLAKE MANAGER SALES
而现在可以利用子查询,在 select子句里面简化操作
SQL> select e.empno,e.ename,e.job,(
2 select dname d from dept d where d.deptno=e.deptno)
3 from emp e;
EMPNO ENAME JOB (SELECTDNAMEDFROMDEPTDWHERED
---------- -------------------- ------------------ ----------------------------
7369 SMITH CLERK RESEARCH
7499 ALLEN SALESMAN SALES
7521 WARD SALESMAN SALES
7566 JONES MANAGER RESEARCH
7654 MARTIN SALESMAN SALES
7698 BLAKE MANAGER SALES
7782 CLARK MANAGER ACCOUNTING
7839 KING PRESIDENT ACCOUNTING
7844 TURNER SALESMAN SALES
7900 JAMES CLERK SALES
7902 FORD ANALYST RESEARCH
7934 MILLER CLERK ACCOUNTING
8989 HELLO
这个查询语句实现了和上面查询语句等同的效果
实际上,在 select子句里面出现子查询的核心目的在于行列转换