一个菜鸟的oracle之路---------三(续)

2,关联子查询 对比非关联子查询,掌握语法
案例20 哪些员工的薪水比公司的平均薪水低
公司的平均薪水
select avg(nvl(salary,0))
            from emp_xxx;

//我的解决方法
//我的方法把薪水为0的职工也包括进来了
     select ename, nvl(salary,0)
            from emp_xxx
              where nvl(salary,0)<(select avg(nvl(salary,0))
            from emp_xxx);


2.1 关联子查询演示
子查询不再是独立的sql语句,需要依赖查询传来的参数,这种方式叫关联子查询
案例21 哪些员工的薪水比本部门的平均薪水低?不再和整个部门的平均薪水相比
//首先查询单个部门内的平均薪水
select deptno,avg(nvl(salary,0))
            from emp_xxx
            group by deptno;


//下面是我的错误解法
 select ename,salary,deptno
            from emp_xxx             
            where salary>(select avg(nvl(salary,0))
                           from emp_xxx
                           group by deptno);
            group by deptno;


//正确答案
   select ename,salary,deptno
             from emp_xxx a
               where salary<(
                             select avg(nvl(salary,0))
                             from emp_xxx
                             where deptno=a.deptno);


//感觉该知识还没有掌握了解
//主要是用到主查询传来的参数
//子查询不再是独立的sql语句,需要依赖主查询传来的参数a.deptno
2.2 Exists 关键字
案例22 哪些人是其他人的经理?查找由下述的员工
方法1,使用关联子查询完成
 select ename 
                  from emp_xxx a
                    where exists(
                                 select 1 from emp_xxx
                                 where mgr=a.empno);


Exists关键字判断子查询有没有数据返回,有则为true,没有返回false
exists 不关心子查询的结果,所以子查询中的select后面写什么都可以
sql 执行顺序从主查询开始,
把主查询中的empno数据传入子查询,作为条件的参数
方法2 普通子查询
       select ename
                   from emp_xxx
                     where empno in(
                                   select distinct mgr
                                   from emp_xxx
                                   );


//该普通方法不了解mgr是什么意思
//????????????
//mgr的意思是我建的数据库的一个字段,是管理者的意思
案例23 哪些人不是别人的经理
方法1 关联子查询
 select ename
                 from emp_xxx a
                   where not exists(
                                select 1 from emp_xxx
                                 where mgr=a.empno);


方法2 普通子查询
   select ename
                  from emp_xxx
                    where empno not in(
                                       select distinct mgr
                                       from emp_xxx
                                       where mgr is not null);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值