where 子查詢主要功能是控制數據行的,返回結果一般都是單行單列、多行單列、單行多列數據 單行單列 多行單列 (使用不多) 多行單列 使用三個判斷符號:IN、ANY、ALL 此時有一個需要註意的小問題了:在使用 NOT IN 的時候子查詢之中必須不能包含 null,否則不會有任何數據返回。 · = ...
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 子句裡面使用子查詢,是因為在外部查詢里無法再繼續使用統計函數操作的時