Oracle子查詢(嵌套查詢)


概念:

所謂子查詢,即一個select語句中嵌套了另外的一個或者多個select語句

 

需求:查找和Smith同部門的所有員工的idlast_name

目標: 員工id,last_name

from:  s_emp

條件: s_emp.dept_id = Smith所在部門的id

select id,last_name

from s_emp

where dept_id = ?

 

階段目標: Smith所在部門的id

目標: dept_id

from : s_emp

條件: last_name = 'Smith';

select dept_id

from s_emp

where last_name = 'Smith';

 

組合:

select id,last_name

from s_emp

where dept_id = (

select dept_id

from s_emp

where last_name = 'Smith'

)

 

應用場景:

1.一條查詢語句的查詢條件依賴另外一條查詢語句的查詢結果。

2.一條查詢語句的查詢結果是作為另外一條查詢語句的查詢表(查詢依據)

3.DML操作中使用子查詢(后期介紹)

 

子查詢的基本原則:

1.在查詢中可以有單行子查詢和多行子查詢

2.子查詢可以出現在操作符的左邊或者右邊

3.子查詢在很多sql命令中都可以使用

4.嵌套查詢先執行,然后將結果傳遞給主查詢。

 

 

一、比較值不確定,需要另外一個select語句執行后才能得到,使用子查詢

語法:

select ...

from ...

where col_name 比較操作符 (

select ...

from ...

where ...

group by ...

having...

)

group by ...

having...

order by ...

 

單值子查詢:子查詢的結果為1

需求:

1.查詢和Simith職稱相同的所有員工的last_name和職稱

分析步驟:

1.確定最終查詢結果(目標/主查詢):查詢員工的last_nametitle

  from : s_emp

  條件 title = Smith的職稱

select last_name,title

from s_emp

where title = ?

2.確定條件(子查詢)Smith的職稱

from : s_emp

條件 last_name = 'Smith';

select title

from s_emp

where last_name = 'Smith';

3.組合

select last_name,title

from s_emp

where title = (select title

from s_emp

where last_name = 'Smith');

2.查看工資大於Chang員工工資的所有員工的id和名字。

最終目標:員工的id,last_name

froms_emp

條件: salary > Chang員工的工資

select id,last_name

from s_emp

where salary > ?

 

階段目標:Chang員工的工資

from s_emp

條件: last_name = 'Chang';

select salary

from s_emp

where last_name = 'Chang';

 

組合:

 

 

3.查看員工工資小於平均工資的所有員工的id和名字

 

例如:查找和Smith同一個部門的員工的idlast_name

 

 

多值子查詢:子查詢的結果為多個

需求:

1.查詢所在區域為2號區域的所有部門的員工的idlast_name

 1.確定最終查詢結果: 員工的id, last_name

   from : s_emp

   條件 s_emp.dept_id  in (?);

select id,last_name

from s_emp

where dept_id  in ?

 2.確定條件:所在區域為2號部門id

子查詢:部門id

from : s_dept

條件: region_id = 2;

select id

from s_dept

where region_id = 2;

 3.組合:

select id,last_name

from s_emp

where dept_id  in (

select id

from s_dept

where region_id = 2

)

 

 

子查詢出現情況二:

查找的內容不確定,需要從構建出來一個查詢的表

語法:

select ....

from (select .... from ....) b

where ......

 

練習:查詢各部門的idname 和部門員工的平均工資

 

1.查詢目標:

需要部門的id,部門的name ------ s_dept表中

部門員工的平均工資 avg(salary) --------- salary只有s_emp表中有

條件 部門idname和部門 員工,因此要求部門的id跟員工所在部門的id相等才連接

select id,name, 平均工資

from s_dept , ?

where s_dept.id = ?.dept_id;

 

2.查詢條件

select(dept_id,avg(salary) sal)

from s_emp

group by dept_id;

 

3.組合:

select id,name,b.sal

from s_dept dept,(select dept_id,avg(salary) sal

from s_emp

group by dept_id

) b

where dept.id = b.dept_id; 


免責聲明!

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



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