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


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 子句里面使用子查詢,是因為在外部查詢里無法再繼續使用統計函數操作的時


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM