1. 程式人生 > >徹底搞懂Oracle的左外連線和右外連線(以資料說話)

徹底搞懂Oracle的左外連線和右外連線(以資料說話)

Employees表:

   

Department表:

   

select e.last_name,e.department_id,d.department_name

from employees e

left outer join departments d

on (e.department_id = d.department_id);

select e.last_name, d.department_name

from employees e, departments d

where e.department_id = d.department_id(+)               左外連線

結果為:所有員工及對應部門的記錄,包括沒有對應部門編號department_id的員工記錄。

select e.last_name,e.department_id,d.department_name

from employees e

right outer join departments d

on (e.department_id = d.department_id);

select e.last_name, d.department_id,d.department_name

from employees e, departments d

where e.department_id(+) = d.department_id;                  右外連線

結果為:所有員工及對應部門的記錄,包括沒有任何員工的部門記錄。

 

 總結:

right outer join B

結果是:所有B表記錄,及匹配的A表記錄,A表未匹配上的顯示null

A(+)=B

 left outer join B

A=B(+)

結果是:所有A表記錄,及匹配的B表記錄,B表未匹配的顯示null

經典總結:

  有+號的表不全部顯示,對面的表全部顯示。

口訣:

右外連線+在左

左外連線+在右

有+不全顯

無+就全顯

全外連線:在等值連線的基礎上將左右表未匹配的資料都加上

自連線:

SELECT w.first_name||''||w.last_name||'works for'||
        m.first_name||''||m.last_name
FROM  

  employee w,employees m
WHERE  w.manager_id=m.employee_id
ORDER BY w.first_name;