使用关联子查询检索某个职位的员工薪金(sal)是否超出平均水平,
所使用的查询语句如下:SQL> select ename,job,sal
      from emp t
      where sal>(select avg(sal) 
                 from emp
                 where t.job=job);要"检索某个职位的员工薪金(sal)是否超出平均水平",上面的查询语句是如何工作的,它是怎么找出"个职位的平均工资"和"每个员工的职位"。
我的想法是 先执行子查询select avg(sal)   from emp 然后在执行外面的
但是很多教程都是说关联子查询是 数据一行一行的传到子查询,我不是很明白,如果一行一行的传进来,里面
select avg(sal) from emp 岂不是每次只对一条数据进行avg操作?
另外关联子查询的inner.x=outer.x这个条件仅仅是连接作用吗?(有点迷糊)
另外exists,not exists只能用在关联子查询中吗?谢谢

解决方案 »

  1.   

    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   FILTER
       2    1     TABLE ACCESS (FULL) OF 'EMP'
       3    1     SORT (AGGREGATE)
       4    3       TABLE ACCESS (FULL) OF 'EMP'看看执行计划,把当前的JOB逐一传递到子查询中,获取平均工资,然后在父查询返回符合的行,我是这样理解的
      

  2.   

    你的这个查询应该是每条都要查询下
    因为你有这个
    where t.job=job
      

  3.   

    --------------------------------------------------------
    | Id  | Operation            | Name    | Rows  | Bytes |
    --------------------------------------------------------
    |   0 | SELECT STATEMENT     |         |     1 |    37 |
    |*  1 |  HASH JOIN           |         |     1 |    37 |
    |   2 |   VIEW               | VW_SQ_1 |     5 |    95 |
    |   3 |    HASH GROUP BY     |         |     5 |    60 |
    |   4 |     TABLE ACCESS FULL| EMP     |    14 |   168 |
    |   5 |   TABLE ACCESS FULL  | EMP     |    14 |   252 |看了下执行计划
    内部查询先按job group by,查出各个job的avg值
    然后和外表 依据job=job  hash join 得出值  
    所以不会出现楼主的说法