1. 程式人生 > >Oracle多表關聯查詢

Oracle多表關聯查詢

select e.empno, e.ename, d.deptno, d.dname
  from emp e, dept d
 where e.deptno = d.deptno;

在上述sql語句中先執行 from 後執行select和where  如果使用了別名的話以後引用表都要使用別名不然會報錯  別名最長為30個字元 

內連線

select e.empno, e.ename, d.deptno, d.dname
  from emp e
  join dept d
    on e.deptno = d.deptno
from 後直接接兩張表名 系統會將兩張表做笛卡爾乘積操作  會生成一張笛卡爾積中間表 (這張表相當於兩個集合做乘操作 參考兩個集合相乘) 如果兩張表都很大的話中間表就會很大 會佔用很大的記憶體空間

 

如果使用join操作 會優先判斷 是否符合 join 後所接on的條件  使生成結果不會太大

 

外連線  分為left outer join          right outer join      full outer join

內連結只能查詢到符合條件的結果  左外連線可以使某一張表或兩張表的資料完全顯示出來

left join 和right join還可以用(+)來代替

(+)應放在缺少相應資訊的一邊

左連線的主表是join左邊的表 為主表  內容會全部顯示

select e.empno, e.ename, d.deptno, d.dname from emp e left join dept d on e.deptno = d.deptno ; 

左外連結的加號寫法

select e.empno, e.ename, d.deptno, d.dname from emp e, dept d where e.deptno = d.deptno(+);


 

上圖為執行之後的結果  由表格可知  第十五條資料 的e.deptno 為空不符合 連線條件  但還是顯示出來了

右連線

右連線的主表是join右邊的表 為主表  內容會全部顯示

select e.empno, e.ename, d.deptno, d.dname from emp e right join dept d on e.deptno = d.deptno ;

右外連結的加號寫法

select e.empno, e.ename, d.deptno, d.dname from emp e, dept d where e.deptno(+) = d.deptno 

dept表中deptno = 40 的 在emp表中沒有與之對應的資料 但在右連線中可以完全顯示dept表中的資料

完全外連線

相當於做左連和右連後去重值

select e.empno, e.ename, d.deptno, d.dname from emp e full join dept d on e.deptno = d.deptno ; 

 

自然連線

會對錶總具有相同列明的做自動連線

select *  from emp e natural join dept   ;

限定多 不實用  僅做了解

自連線

自己和自己做連線 以scott 的emp表為例  mgr欄位為該員工的 領導編號 該表中存在主從關係 

又因要查詢所有員工的領導及其編號所以在下面用左連線

select em2.empno 領導的員工編號,
       em2.ename 領導姓名,
       em1.empno 員工導編號,
       em1.ename 員工姓名,
       em1.mgr   對應領導的員工編號
  from emp em1
  left join emp em2
    on em1.mgr = em2.empno
 order by em2.empno ;

交叉連線  

做兩張表的笛卡爾積

select * from emp cross join dept

基本用不到  作為了解
 

總結一下

內連線 

只篩選符合條件的

外連結

分為左外右外和完全外連結

左外顯示符合條件的 以及左表不符合條件的  右表只有符合條件的

剩下兩種略

自連線

自己和自己做連線  因為用的都是一張表(本身)所以一定要用別名