课件内容

Oracle SQL

3.5 到此,我们已经了解了四类子查询,但在使用子查询时还要注意以下几点:

   
A、 HAVING子句中也可以使用子查询。

例:

SELECT deptno,job,AVG(sal) FROM EMP

GROUP BY deptno,job

HAVING AVG(sal)>(SELECT sal FROM EMP WHERE ename=’MARTIN’);

(有关本节演示请参见实验演示)

B、 在一些比较复杂的子查询中,可能需要多次处理同一个子查询,为了优化这一步骤,ORACLE9i引入了“WITH”子句来提高这类子查询的性能。

例:

    SELECT dname,SUM(sal) AS dept_total

    FROM EMP,DEPT

    WHERE EMP.deptno=DEPT.deptno

    GROUP BY dname

    HAVING SUM(sal)>(SELECT SUM(sal)*1/3

                      FROM EMP,DEPT

                      WHERE EMP.deptno=DEPT.deptno)

    ORDER BY SUM(sal) DESC;

显然,子查询“SELECT SUM(sal) FROM EMP,DEPT WHERE EMP.deptno=DEPT.deptno”处理了两次。因此,可以利用O9i中的下来语法来改善性能:

    WITH summary AS

    ( SELECT dname,SUM(sal) AS dept_total

FROM EMP,DEPT

      WHERE EMP.deptno=DEPT.deptno

      GROUP BY dname )

    SELECT dname,dept_total FROM summary

    WHERE dept_total>(SELECT SUM(dept_total)*1/3 FROM summary)

    ORDER BY dept_total DESC;  

      C、在一些子查询操作,诸如数据分组,可能会产生空值。然而,在子查询把这些数据集返回给主查询时又会忽略空值。因此,应特别小心这种情况。