徹底搞懂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; 右外連線
結果為:所有員工及對應部門的記錄,包括沒有任何員工的部門記錄。
總結:
A 表right outer join B表
結果是:所有B表記錄,及匹配的A表記錄,A表未匹配上的顯示null
A(+)=B
A 表 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
WHERE w.manager_id=m.employee_id
ORDER BY w.first_name;