如题:新人请教一下SQL的执行顺序,还有一个关于Oracle中相关子查询如何理解更容易???
SELECT * FROM TEACHERS T1 
WHERE WAGE > (SELECT AVG(WAGE) 
FROM TEACHERS T2 
WHERE T1.DEPARTMENT_ID = T2.DEPARTMENT_ID);

解决方案 »

  1.   

    查看下执行计划就知道了:1.explain plan for SELECT   *   FROM   TEACHERS   T1   
    WHERE   WAGE   >   (SELECT   AVG(WAGE)   
    FROM   TEACHERS   T2   
    WHERE   T1.DEPARTMENT_ID   =   T2.DEPARTMENT_ID);2.select * from table(DBMS_XPLAN.Display);
      

  2.   


    explain plan FOR SELECT   *   FROM   emp   T1   
    WHERE   sal   >   (SELECT   AVG(sal)   
    FROM   emp   T2   
    WHERE   T1.empno   =   T2.empno);
    select * from table(DBMS_XPLAN.Display);
    Plan hash value: 3931844469                                                     
                                                                                    
    --------------------------------------------------------------------------------
    | Id  | Operation            | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT     |         |     1 |    64 |     8  (25)| 00:00:01 |
    |*  1 |  HASH JOIN           |         |     1 |    64 |     8  (25)| 00:00:01 |
    |   2 |   VIEW               | VW_SQ_1 |    16 |   416 |     4  (25)| 00:00:01 |
    |   3 |    SORT GROUP BY     |         |    16 |   128 |     4  (25)| 00:00:01 |
    |   4 |     TABLE ACCESS FULL| EMP     |    16 |   128 |     3   (0)| 00:00:01 |
    |   5 |   TABLE ACCESS FULL  | EMP     |    16 |   608 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------------
                                                                                    
    Predicate Information (identified by operation id):                             
    ---------------------------------------------------                             
                                                                                    
       1 - access("T1"."EMPNO"="EMPNO")                                             
           filter("SAL">"VW_COL_1")                                                 
      

  3.   

    1.FROM TEACHERS T1   
    2.FROM TEACHERS T2   
    3.WHERE T1.DEPARTMENT_ID = T2.DEPARTMENT_ID
    4.SELECT AVG(WAGE)
    5.SELECT   *