目录
在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 emp3 group by deptno;DEPTNO COUNT(*) AVG(SAL)
---------- ---------- ----------30 6 1566.6666710 3 2916.6666720 3 2258.33333
第二步:如果要想知道哪些部门的平均工资高于公司的平均工资,则应该进行 emp 表的统计查询
SQL> select avg(sal) from emp;AVG(SAL)
----------
2077.08333
此时的子查询返回了单行单列的数据,那么肯定要在 having子句里面使用
第三步:对数据过滤
SQL> select deptno,count(*),avg(sal)2 from emp3 group by deptno4 having avg(sal)>(5 select avg(sal) from emp);DEPTNO COUNT(*) AVG(SAL)
---------- ---------- ----------10 3 2916.6666720 3 2258.33333
这个可能有点难度哈,需要多加练习
在select子句中使用子查询
首先需要明确的是,这样操作的意义不大,而且效率不高。不过我们也介绍一下它 的使用方法
查询每个员工的编号、姓名、职位、部门名称
按照一般思路,可以使用多表查询,即下面的查询语句
SQL> select e.empno,e.ename,e.job,d.dname2 from emp e,dept d3 where e.deptno=d.deptno;EMPNO ENAME JOB DNAME
---------- -------------------- ------------------ ----------------------------7839 KING PRESIDENT ACCOUNTING7782 CLARK MANAGER ACCOUNTING7934 MILLER CLERK ACCOUNTING7902 FORD ANALYST RESEARCH7369 SMITH CLERK RESEARCH7566 JONES MANAGER RESEARCH7900 JAMES CLERK SALES7844 TURNER SALESMAN SALES7654 MARTIN SALESMAN SALES7521 WARD SALESMAN SALES7499 ALLEN SALESMAN SALES7698 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 RESEARCH7499 ALLEN SALESMAN SALES7521 WARD SALESMAN SALES7566 JONES MANAGER RESEARCH7654 MARTIN SALESMAN SALES7698 BLAKE MANAGER SALES7782 CLARK MANAGER ACCOUNTING7839 KING PRESIDENT ACCOUNTING7844 TURNER SALESMAN SALES7900 JAMES CLERK SALES7902 FORD ANALYST RESEARCH7934 MILLER CLERK ACCOUNTING8989 HELLO
这个查询语句实现了和上面查询语句等同的效果
实际上,在 select子句里面出现子查询的核心目的在于行列转换