Oracle: 四、Oracle連接查詢,子查詢(相關子查詢,嵌套子查詢)(下)


內容簡介

   1,Demo連接查詢2,Demo 子查詢(相關子查詢,嵌套子查詢)

技術與環境

操作系統:

windows

語言類別:

SQL之PL/SQL

thankyou: sunshine, 謝謝你的默默付出

數據庫:

Oracle

學習軟件:

Oracle 10g

課程總策划:

yuanbo

English name:

sunshine

個人主頁:

http://www.cnblogs.com/ylbtech/

科研團隊:

ylbtech

教研團隊:

ylbtech

1,Demo連接查詢  
--========================================================
--ylb:Oracle
--17:13 2011-12-30
--1,鏈接查詢(傳統鏈接、內鏈接)
--========================================================
 
--總結:什么時候使用連接查詢?
--當需要顯示的數據來源於多個表時,使用連接查詢。
--一,連接查詢--分傳統連接與內連接
/*
1,查詢員工姓名和所在部門的名稱(2種 )
--傳統連接  --依賴的是    ,和where
*/
select * from emp,dept where emp.deptno=dept.deptno
select ename,dname,emp.deptno from emp ,dept where emp.deptno=dept.deptno;
select * from emp a ,dept b where a.deptno=b.deptno;
select a.ename,b.dname from emp a,dept b where a.deptno=b.deptno
select a.ename,b.dname,a.deptno from emp a,dept b where a.deptno=b.deptno
--內聯接    --依賴的是     inner join   on 
select * from emp a inner join dept b on a.deptno=b.deptno
 
2,查詢員工姓名和所在部門的名稱,要求部門編號為30(2種 )
select a.ename,b.dname from emp a inner join dept b on a.deptno=b.deptno where a.deptno=30
select a.ename,b.dname from emp a,dept b where a.deptno=b.deptno and a.deptno=30
3,查詢員工姓名和部門名稱,要求沒有員工的部門的名稱也要查詢出來
--傳統連接 :使用”(+)“
select * from emp a ,dept b where a.deptno(+)=b.deptno;
select * from emp a ,dept b where b.deptno=a.deptno(+);
--使用join連接 :   
右外連接
select * from emp a right outer join dept b on a.deptno=b.deptno

左外連接  
select * from emp a left outer join dept b on a.deptno=b.deptno;
     
全外連接: 
--只能用標准sql來書寫
 select * from emp a full outer join dept b on a.deptno=b.deptno;
 
4,查詢員工姓名和其直接上級的姓名,要求沒有經理的員工也查詢出來
--自連接
員工 SMITH 的上級是 FORD
select '員工'||a.ename||'的上級是'||b.ename from emp a left outer join emp b on a.mgr=b.empno;
select '員工'||a.ename||'的上級是'||b.ename from emp a,emp b where a.mgr=b.empno(+)

select a.ename,b.ename from emp a,emp b where a.mgr=b.empno(+)
2,Demo 子查詢(相關子查詢,嵌套子查詢)
--========================================================
--ylb:Oracle
--17:13 2011-12-30
--1,子查詢(嵌套子查詢、相關子查詢)
--========================================================
/*** 
連接與子查詢的區別:
1,當需要多個表的數據時用連接,子查詢只能返回單表數據。
2,連接快,子查詢慢。
3,子查詢功能強大。
4,子查詢-兩種(嵌套子查詢,關聯子查詢)
 嵌套簡單,關聯復雜,面試關聯查詢
**/


--一, 子查詢第一種 : 嵌套子查詢:簡單--子查詢可以獨立運行,自內而外
--1,查詢工資高於SMITH工資的所有員工
select * from emp where sal>(select sal from emp where enAme='SMITH')
go
--2,查詢工資高於公司平均工資的所有員工?
select * from emp where sal>(select avg(sal) from emp)
--附加題,
--> >= < <= = != <> ^= 后面只能跟一個值,
--如果有多個值,>all--大於最大值    >any--大於最小值
--查詢工資高於所有部門的平均工資的員工
select * from emp where sal>all(select avg(sal) from emp group by deptno)
--查詢工資高於任何部門的平均工資的員工

select * from emp where sal>any(select avg(sal) from emp group by deptno)
    
    
go
/*********************************************************************************/                
--二, 子查詢第二種 : 關聯子查詢 ,思考:自外而內
--3,查詢工資高於本部門平均工資的所有員工?
select * from emp a where a.sal>(select avg(sal) from emp where deptno=a.deptno)
--4,查詢本部門最高工資的員工?(三種方法)
--方法一,使用嵌套子查詢(非關聯子查詢)
select * from emp a where (a.deptno,a.sal) in (select deptno,max(sal) from emp group by deptno)
--方法二,使用關聯子查詢/*9-******************
select * from emp a where a.sal=(select max(sal) from emp where deptno=a.deptno)
--方法三,使用關聯子查詢的名次問題,名次=人數+1 
sal=800
deptno=20
select * from emp a 
where (
select count(*) from emp 
where deptno=a.deptno and sal>a.sal)=1
/*********************************************************************************/   


go
--補充題:
--查詢本部門第二高工資的員工?(一種方法)
--5,查詢本部門最低工資的員工 ?
select * from emp a where (select count(*) from emp where deptno=a.deptno and sal<a.sal)=0                                   

------------------------------------------------------三,select 語句做表達式
--6,統計每個部門的信息和人數?
select a.*,(select count(*) from emp where deptno=a.deptno) 人數 from dept a
select a.* from dept a
   
select a.deptno,b.dname,b.loc,count(*) from emp a,dept b where a.deptno=b.deptno group by a.deptno,b.dname,b.loc
               
--7,統計每個部門工資在(500-1000)/(1000-3500)/(3500-7000) 的人數?
select a.*,
(select count(*) from emp where deptno=a.deptno and sal>500 and sal<=1000) "500-1000",
(select count(*) from emp where deptno=a.deptno and sal>1000 and sal<=3500),
(select count(*) from emp where deptno=a.deptno and sal>3500 and sal<=7000) 
from dept a 

 

warn 作者:ylbtech
出處:http://ylbtech.cnblogs.com/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

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



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