子查詢可區分為關聯子查詢和非關聯子查詢,他們和外層查詢之間的執行順序和關系是不同的。
1. 關聯子查詢:
在關聯子查詢中,對於外部查詢返回的每一行數據,內部查詢都要執行一次。另外,關聯子查詢的信息流是雙向的,外部查詢的每行數據傳遞一個值給子查詢,然后子查詢為每一行數據執行一次並返回它的記錄,之后外部查詢根據返回的記錄做出決策。
select * from dept d where exists(select * from emp e where e.deptno = d.deptno);
特點:
1、先執行外層查詢
2、再執行內層查詢
2. 非關聯子查詢:
非相關子查詢是獨立於外部查詢的子查詢,子查詢執行完畢后將值傳遞給外部查詢。
select * from emp where sal = (select max(sal) from emp);
特點:
1、先執行內層查詢
2、再執行外層查詢
3.子查詢結果的三種情況:
1) 子查詢的結果是單行單列
子查詢結果只要是單行單列, 肯定在 WHERE 后面作為條件, 父查詢使用: 比較運算符, 如: > 、 <、 <>、 =等
2) 子查詢的結果是多行單列
子查詢結果是單例多行,結果集類似於一個數組,父查詢使用 IN 運算符
3) 子查詢的結果是多行多列
子查詢結果只要是多列,肯定在 FROM 后面作為表