1. 程式人生 > >oracle 子查詢 where having from ,from子查詢提高效率

oracle 子查詢 where having from ,from子查詢提高效率

如果 clas 性能問題 查詢 嵌入 區別 group 一個 col

where 子查詢主要功能是控制數據行的,返回結果一般都是單行單列、多行單列、單行多列數據

單行單列

SELECT *

FROM emp

WHERE hiredate=(

  SELECT MIN(hiredate)

  FROM emp) ;

多行單列 (使用不多)

SELECT *

FROM emp

WHERE (sal,job)=(

  SELECT sal,job

  FROM emp

  WHERE ename=SCOTT)

  AND ename<>SCOTT ;

多行單列 使用三個判斷符號:IN、ANY、ALL

SELECT *

FROM emp

WHERE sal NOT IN (

  SELECT sal

  FROM emp

  WHERE job=MANAGER) ;

此時有一個需要註意的小問題了:在使用 NOT IN 的時候子查詢之中必須不能包含 null,否則不會有任何數據返回。

· =ANY:此功能與 IN 操作完全一樣

· >ANY:比子查詢的最小值要大;

· <ANY:比子查詢的最大值要小

· >ALL:比子查詢返回的最大值還要大

· <ALL:比子查詢最小值還要小

在 HAVING 子句之中使用子查詢只能夠返回單行單列的數據

SELECT job,AVG(sal)

FROM emp

GROUP BY job

HAVING AVG(sal)=(

SELECT MIN(AVG(sal))

FROM emp

GROUP BY job

)

//分組函數嵌入太深錯誤
SELECT job,AVG(sal)
FROM emp
GROUP BY job
HAVING AVG(sal) = MIN(AVG(sal))

FROM 子句的主要功能是確定數據來源,而且數據來源應該都是數據表,表是一種行列的集合。所以就證明如果在


FROM 子句裏面出現的子查詢,其返回的結果一定是多行多列數據。

SELECT d.deptno,d.dname,d.loc,temp.count,temp.avg
FROM dept d , (
    SELECT deptno ,COUNT(empno) count,AVG(sal) avg
    FROM emp
    GROUP BY deptno) temp 
WHERE d.deptno=temp.deptno(+) ;
SELECT d.deptno,d.dname,d.loc,COUNT(empno) count,AVG(sal) avg
FROM dept d ,emp e 
WHERE d.deptno=e.deptno(+)
GROUP BY d.deptno,d.dname,d.loc

多字段分組和from子查詢的區別?

即:此時 emp 表之中存在有 14000 條數據,dept 表中存在有 4000 條數據。

多表查詢一定會產生笛卡兒積

多字段分組:積的數量:emp 的 14000 條 * dept 的 4000 條 = 56,000,000 條數據;

from子查詢:

|- 第一步(內嵌子查詢):針對於 emp 表查詢,最多操作 14000 條記錄,最多返回 4000 條記錄;
|- 第二步,子查詢和 dept 表關聯;
|- 積的數量:dept 表的 4000 條 * 子查詢返回的最多 4000 條 = 16000000 條記錄;
|- 總的數據量:16000000 + 14000 = 16,014,000 條記錄

主要目的:子查詢的出現主要是為了解決多表查詢之中的性能問題。

次要目的:很多時候在 FROM 子句裏面使用子查詢,是因為在外部查詢裏無法再繼續使用統計函數操作的時

技術分享圖片

oracle 子查詢 where having from ,from子查詢提高效率