使用关联子查询检索某个职位的员工薪金(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只能用在关联子查询中吗?谢谢
所使用的查询语句如下: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只能用在关联子查询中吗?谢谢
----------------------------------------------------------
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逐一传递到子查询中,获取平均工资,然后在父查询返回符合的行,我是这样理解的
因为你有这个
where t.job=job
| 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 得出值
所以不会出现楼主的说法