子查詢
語法結構:
select 查詢列
from 表名
where 列名 操作符 (select 查詢列
from 表名)
select語句中可以巢狀其它的select語句參與比較和運算。
裡層:子查詢括號內的查詢叫做子查詢或內部查詢
外層:主查詢外面的查詢叫做主查詢或者外部查詢
注意:
子查詢需要寫在括號中
子查詢需要寫在運算子的右端
子查詢可以寫在where,having,from子句中
子查詢通常不寫在order by字句
子查詢的種類:
單行子查詢:子查詢返回的記錄只有一條 返回單行單列 > < >= <= <>
多行子查詢:子查詢返回記錄的條數可以是一條或多條
All:
Any 表示任意的,比子查詢返回的任意個結果小即可
>any比裡面的最小的大
in 比子查詢返回的任意一個結果相等
多列子查詢:返回多列
分類:
非關聯子查詢
執行順序:先執行子查詢,返回結果後,在進行主查詢
即必須先執行完成內層查詢之後,外層查詢才能介入
關聯子查詢
執行步驟:1)主查詢得到一條記錄並將其傳入到內部查詢
2)內部查詢基於傳入的值查詢
3)內部查詢從其結果中把值傳回到外部查詢,外部查詢使用這些值
來完成其處理
注意:a.在關聯子查詢中,對於外部查詢返回的每一行資料,內部查詢都要執行一次
b.在關聯子查詢中資訊是雙向的
c.外部查詢的每行資料傳遞一個值給子查詢,然後子查詢為每一行資料
執行一次並返回它的記錄,外部查詢根據返回的記錄做出決策
例如:select ename
from emp e
where hiredate
from emp
where e.ename=ename
);
每個部門拿最高薪水的是誰?
select ename,job,deptnmo
from emp
where (deptno,salary) in(select deptno max(salary)
from emp
where deptno is not null
group by deptno
)
對於exist和in的使用方法:
a.in是子查詢作為驅動表,外面的表為被驅動表,所以適用於子查詢結果集
小於外面的結果集的情況。一般用於非關聯子查詢
b.exists是外面的表驅動表,子查詢裡面的為被驅動表,故適用於外面的表結果集
小於子查詢結果集的情況。一般用於關聯子查詢
select ename
from emp
where exists(
select * from dept
where a.id=b.id//必須先找出emp中符合條件的記錄
必須先執行外層迴圈
)
關聯子查詢和非關聯子查詢的不同:
a.對於關聯子查詢,必須先執行外層查詢,接著對所有通過過濾條件的記錄
執行內層查詢,外層查詢和內層查詢相互依賴,因為外層迴圈會把資料傳遞給內層查詢
b非關聯子查詢即必須先執行完成內層查詢之後,外層查詢才能介入
Oracle基礎要點 (共8篇) 上一篇:組函式 下一篇:表連線