ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

在having、select子句中使用子查询

2026/8/22 13:56:24 拓冰建站 浏览量
在having、select子句中使用子查询

目录

在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子句里面出现子查询的核心目的在于行列转换