一、外連接
oracle 連接查詢分為外鏈接和內連接,我們先看外連接【outer join】。oracle 的外連接查詢分為:
- 左外連接 (左邊的表不加限制) left outer join;
- 右外連接 (右邊的表不加限制) right outer join;
- 全外連接 (左右兩表都不加限制)full outer join; 通常outer關鍵字可省略,寫成:left/right/full join 即可。
在左右連接時,通常都會以一張表如A表為基礎表,該表的內容會全部顯示,再加上A表和B表匹配的內容。如果A表中的數據在B表中沒有記錄,那么會在結果集中以空值顯示。
關於外連接,也可以使用(+)來表示。關於使用(+)的一些注意事項:
- (+)操作符只能出現在where子句中,且不能與 outer join 語句同時使用。
- 使用(+)操作符執行外連接時,如果where子句中存在有多個條件,則必須在所有條件中都包含(+)操作符。
- (+)操作符值適用於列,不能用在表達式上
- (+)操作符不能與OR和IN操作符一起使用
- (+)只能用於實現左外連接和右外連接,不能用於實現全外連接。
1.左外連接--left (outer) join
左外連接是以左表為基礎表,示例中以 emp 表為左表,顯示所有的查詢數據;以 dept 表為右表,顯示與 emp 表匹配后的數據,即顯示符合查詢條件的數據。
select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e left join dept d on e.deptno=d.deptno; 或 select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e left outer join dept d on e.deptno=d.deptno;
用(+)操作符來實現。這個(+) 操作符可以這樣理解: + 表示補充,即哪個表有+號,哪個表就是匹配表。如果 + 號寫在右表,則左表就全部顯示,所以為左連接。
【(+):Oracle專用的聯接符,在條件中出現在左邊指右外聯接,出現在右邊指左外聯接】
select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e,dept d where e.deptno=d.deptno(+);
2.右外連接--right (outer) join
右外連接與左外連接正好相反,它是以右表為基礎表。在示例中,dept 表為右表,全部顯示;emp 表為左表,顯示符合查詢條件的數據。emp表記錄不足的地方顯示為NULL。
select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e right join dept d on e.deptno=d.deptno; 或 select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e right outer join dept d on e.deptno=d.deptno;
用(+)操作符顯示,即為:
select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e,dept d where e.deptno(+)=d.deptno;
紅線框中為dept表中有,而emp表中沒有的數據,顯示為NULL。
3.全外連接--(FULL OUTER JOIN/FULL JOIN)
全外連接對左表和右表都不做限制,所有的記錄均顯示,兩表不足的地方都為NULL。全外連接不支持(+)寫法
select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e full join dept d on e.deptno=d.deptno; 或 select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e full outer join dept d on e.deptno=d.deptno;
二、內連接
內連接也叫簡單連接,只返回滿足條件的記錄。用inner join......on.. 來標記,inner可省略。
select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e inner join dept d on e.deptno=d.deptno; 或 select e.deptno,e.ename,e.job,e.sal,d.dname,d.deptno from emp e join dept d on e.deptno=d.deptno;