06.oracle的子查询连接

oracle的子查询连接

子查询:

​ 嵌套再其他sql语句中的完整sql语句,可以称之为子查询

分类:

单行子查询

多行子查询

-- 有哪些人的薪水是整个雇员的平均薪水之上的
-- 1.先求平均薪水
select avg(sal)
from EMP;
-- 2.把每个人薪水与平均薪水进行比较
select EMPNO, ENAME, SAL
from EMP
where SAL > (select avg(sal)
             from EMP);
-- 1.雇员中哪些人是经理人
select distinct e.MGR
from emp e;
-- 2.查询雇员中的经理人
select EMPNO, ENAME
from EMP
where EMPNO in (select distinct e.MGR
                from emp e);
-- 每个部门的平均薪水等级
-- 1.先求每个部门的平均薪水等级
select e.DEPTNO, avg(SAL)
from EMP e
group by e.DEPTNO;
-- 2.与薪水等级表做关联 查询等级
select t.DEPTNO, sal.GRADE
from (select e.DEPTNO, avg(SAL) sal
      from EMP e
      group by e.DEPTNO) t
         join SALGRADE sal on t.sal between sal.LOSAL and sal.HISAL;
-- 求平均薪水最高的部门部门编号
-- 1.求部门的平均薪水
select e.DEPTNO, avg(SAL) sal
from EMP e
group by e.DEPTNO;
-- 就平均薪水最高的
select max(sal)
from (select e.DEPTNO, avg(SAL) sal
      from EMP e
      group by e.DEPTNO);
-- 求最高平均薪水的部门
select DEPTNO
from (select e.DEPTNO, avg(SAL) sal
      from EMP e
      group by e.DEPTNO) t
where t.sal = (select max(sal)
               from (select e.DEPTNO, avg(SAL) sal
                     from EMP e
                     group by e.DEPTNO));
-- 求部门每个人的薪水等级
select e.DEPTNO, sg.GRADE
from EMP e
         join SALGRADE sg
              on e.SAL between sg.LOSAL and sg.HISAL;
-- 按照部门去平均等级
select t.DEPTNO, avg(t.GRADE)
from (select e.DEPTNO, sg.GRADE
      from EMP e
               join SALGRADE sg
                    on e.SAL between sg.LOSAL and sg.HISAL) t
group by t.DEPTNO;
-- 限制输出,limit,mysql中用来做限制输出的,但是oracle中不是
-- 再oracle中,如果需要做限制输出和分页的话需要使用rownum
-- 但是rownum不能直接使用,需要嵌套使用
-- 4,求薪水最高的前5名雇员
select *
from (select * from emp order by sal desc)
where ROWNUM <= 5;
-- 先查询5条然后在排序
select *
from EMP
where ROWNUM <= 5
order by SAL desc;
-- 使用rownum的时候必须要在外层添加嵌套,此时才能将rownum作为其中一个列,然后再进行限制输出
-- 查询薪资排名6-10员工
select *
from (select * from emp order by SAL desc)
where ROWNUM > 5
  and ROWNUM <= 10;

-- 查询前10雇员
select t1.*,ROWNUM
from (select * from emp order by SAL desc) t1
where ROWNUM <= 10;

select *
from (select t1.*, ROWNUM rn
      from (select * from emp order by SAL desc) t1
      where ROWNUM <= 10) t
where t.rn > 5
  and t.rn <= 10;

select *
from (select t1.*, ROWNUM rn
      from (select * from emp order by SAL desc) t1
    ) t
where t.rn > 5
  and t.rn <= 10;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值