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

本文详细介绍了如何在OracleSQL中使用having子句配合groupby子句计算部门平均工资,并通过子查询筛选出平均工资高于公司平均值的部门。同时,还探讨了在select子句中使用子查询进行行列转换的应用。
摘要由CSDN通过智能技术生成

目录

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

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙子味冰可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值