oracle數據庫連接查詢


簡單查詢、復雜查詢


簡單查詢: 單表


復雜查詢:

1. 子查詢(嵌套查詢)

2. 連接查詢

 

************************連接查詢****************************


一.什么是連接查詢


把多張表連接在一起,一塊查


二.什么時候使用


數據來自於多張表的時候,要使用連接查詢

 

三.連接查詢的分類


1. 內連接

2. 外連接

3. 交叉連接

4. 自然連接


****************************************內連接******************************

--需求:查詢部門編號為10的員工姓名、薪水、部門名稱


--數據來自多張表的時候 使用連接查詢

--sql1999

select e.ename,e.sal,d.deptno,d.dname from dept d inner join emp e

on(d.deptno = e.deptno)

where e.deptno=10

 

執行過程: 先拿着左表的第一條記錄 和右表的所有記錄進行匹配,如果滿足

連接條件, 左表的記錄和右表記錄首尾相連...第一趟


第二趟 拿着左表的第二條記錄 和右表的所有記錄進行匹配,如果滿足連接條件

首尾相連..依次類推

 

--sql1992

select e.ename,e.sal,d.deptno,d.dname from dept d ,emp e

where d.deptno = e.deptno and d.deptno=10


****************************************外連接******************************

分類:

1.左外連接

2.右外連接

3.全外連接

 


一.左外連接


--需求:查詢員工姓名、薪水、部門名稱

--保證左表的數據都有,要使用左外連接

--左外連接: 在內連接的基礎上,保證左表的數據都有

select d.dname,e.ename,e.sal,d.deptno from dept d left outer join emp e

on(d.deptno = e.deptno)

 

outer 可以省略


sql1992


select d.dname,e.ename,e.sal,d.deptno from dept d,emp e

where d.deptno = e.deptno(+)


二.右外連接

在內連接的基礎上,保證右表的數據都有,如果左表以空補齊


select d.dname,e.ename,e.sal,d.deptno from emp e right outer join dept d

on(d.deptno = e.deptno)


--sql1992


select d.dname,e.ename,e.sal,d.deptno from dept d,emp e

where d.deptno = e.deptno(+)


三.全外連接


左外連接的查詢結果 並上 右外連接的查詢結果


--sql1999
select d.dname,e.ename,e.sal,d.deptno from dept d full outer join emp e

on(d.deptno = e.deptno)

 

--sql1992
select d.dname,e.ename,e.sal,d.deptno from dept d,emp e

where d.deptno = e.deptno(+)


UNION

select d.dname,e.ename,e.sal,d.deptno from dept d,emp e

where d.deptno(+) = e.deptno

 

************************交叉連接 cross join (笛卡爾積)****************************

左表中的每一條記錄 和右表中的 每一條記錄 收尾相連 左邊4條 右表14條 查詢結果 一共 56條記錄

sql 1999

select * from dept cross join emp


sql1992

select * from dept,emp

 


************************自然連接 natural join****************************


有點類似於 內連接,它和內連接的區別有兩個


select * from dept natural join emp


(1) 不需要寫連接條件


把兩張表中 相同的字段(名稱相同、類型相同) 自動作為連接條件 給你加上


(2) 會自動的把重復的字段去掉

 

******************************等值連接和非等值連接*****************************


一.等值連接


連接條件相等的為等值連接,剛才學的都屬於等值連接


select ename,dname from emp join dept
on (emp.deptno=dept.deptno);//1999sql


select ename,dname from emp join dept
using (deptno);--等同於上面

 


二.非等值連接

連接條件不相等 例如 != > < between 時 連接兩張表的數據

 

連接第三張表

--需求: 姓名、薪水、部門名稱 、薪水等級


select e.ename,e.sal,d.dname,s.grade from dept d inner join emp e

on (d.deptno = e.deptno) inner join salgrade s

on (e.sal between s.losal and s.hisal)


******************************集合操作*****************************

1.UNION 並集 重復的只顯示一次


第一張表的查詢結果

UNION

第一張表的查詢結果


2.UNION ALL 重復的顯示多次


3. INTERSECT 交集


4. MINUS 差集

 

 

 

*****************--演示需求1:按照部門進行分組之后 每個部門賺錢最多的那個人********************


select t.deptno,e.ename,t.max_sal from emp e

inner join

(select deptno,max(sal) max_sal from emp group by deptno) t

on(e.deptno = t.deptno and e.sal = t.max_sal)


*****************************演示需求2:求每個部門的平均薪水的等級********************

 

--演示需求2:求每個部門的平均薪水的等級

select t.deptno,t.avg_sal,s.grade from

(select deptno,avg(sal) avg_sal from emp group by deptno) t

inner join salgrade s

on(t.avg_sal between s.losal and s.hisal)

 

*******************特殊的連接查詢---自關聯************************


需求: SMITH的上司叫什么


--需求: SMITH的上司叫什么

--1. 先查SMITH上司的編號

select mgr from emp where ename='SMITH'

--2.7902這個員工的姓名

select ename from emp where empno=7902

--合並

 

現在的需求: 把所有員工的姓名 和它的上司叫什么同時顯示出來


自關聯: 一張表當兩張表使用,自己和自己進行連接查詢,叫做自關聯

 

select employee.ename,manager.ename from emp manager

right join emp employee

on(manager.empno = employee.mgr)


免責聲明!

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



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