Oracle(+)連線與Join連線
一個開發組同事在對舊系統程式碼進行分析的時候,發現(+)連線語句。這裡想說說(+)連線和Join連線的使用。
(+)連線是Oracle一種特有的連線方法,和我們常見的Join系列連線同時使用。(+)連線是一種外連線方式,作為簡單連線的一種擴充型別。我們通常理解的連線,是隻將符合連線條件的資料集合返回來。而用外連線之後,可以連帶將特定資料表的不符合條件行一併返回。
Join系列連線的特點是有專門的連線物件和被連線物件,使用on設定專門的連線條件。而(+)連線的連線條件是放置在where條件列表中的。下面我們透過一些實驗,來展示兩者的差異和特徵。
1、 環境準備
我們模擬一個簡單的實驗環境。
SQL> select * from dept;
DEPTNO DEPTNAME
---------- ----------
1 dept1
2 dept2
3 dept3
SQL> select * from emp;
EMPNO EMPNAME DEPTNO
---------- -------------------- ----------
1 emp1 1
2 emp2 1
3 emp3 2
4 emp4 4
兩個資料表是使用deptno進行連線,兩邊分別存在不匹配的內容。如果我們使用最常見的連線方式,結果明顯是嚴格的連線匹配。
SQL> select * from dept, emp where dept.deptno=emp.deptno;
DEPTNO DEPTNAME EMPNO EMPNAME DEPTNO
---------- ---------- ---------- -------------------- ----------
1 dept1 1 emp1 1
1 dept1 2 emp2 1
2 dept2 3 emp3 2
2、(+)連線實驗
(+)連線語句是加入在where條件後的部分,作為查詢條件的一部分。
SQL> select * from dept, emp where dept.deptno(+)=emp.deptno;
DEPTNO DEPTNAME EMPNO EMPNAME DEPTNO
---------- ---------- ---------- -------------------- ----------
1 dept1 2 emp2 1
1 dept1 1 emp1 1
2 dept2 3 emp3 2
4 emp4 4
SQL> select * from dept, emp where dept.deptno=emp.deptno(+);
DEPTNO DEPTNAME EMPNO EMPNAME DEPTNO
---------- ---------- ---------- -------------------- ----------
1 dept1 1 emp1 1
1 dept1 2 emp2 1
2 dept2 3 emp3 2
3 dept3
兩個例子可以告訴我們(+)使用的特點,(+)連線的結果是將(+)號對面的資料表不符合記錄的結果也輸出出來。
(+)連線實質上是一種外連線Outer Join的現象,透過不同的位置來對應不同方向的結果。
3、 Join系列連線
我們經常使用的Join功能要強大的多,而且可讀性好一些。Join的特徵是將連線條件透過專門的on子句進行說明,而不是放置在where子句裡面。
ü 左連線Join
左連線left join是保證from子句中的資料表全部顯示。
SQL> select * from dept
2 left join emp
3 on dept.deptno=emp.deptno;
DEPTNO DEPTNAME EMPNO EMPNAME DEPTNO
---------- ---------- ---------- -------------------- ----------
1 dept1 1 emp1 1
1 dept1 2 emp2 1
2 dept2 3 emp3 2
3 dept3
ü 右連線Join
右連線right join是保證Join的資料表全部顯示。對該子句筆者認為可以變通為left join,這樣似乎更容易看懂。
SQL> select * from dept
2 right join emp
3 on dept.deptno=emp.deptno;
DEPTNO DEPTNAME EMPNO EMPNAME DEPTNO
---------- ---------- ---------- -------------------- ----------
1 dept1 2 emp2 1
1 dept1 1 emp1 1
2 dept2 3 emp3 2
4 emp4 4
ü 全連線full join
全連線是將兩個資料表中符合連線條件或者不符合連線條件的全部列出。注意:不符合連線條件的結果是不會進行連結的。
SQL> select * from dept
2 full join emp
3 on dept.deptno=emp.deptno;
DEPTNO DEPTNAME EMPNO EMPNAME DEPTNO
---------- ---------- ---------- -------------------- ----------
1 dept1 1 emp1 1
1 dept1 2 emp2 1
2 dept2 3 emp3 2
4 emp4 4
3 dept3
ü 內連線inner join
內連線就類似與我們傳統where的連線方式了,返回嚴格符合條件的資料列。
SQL> select * from dept
2 inner join emp
3 on dept.deptno=emp.deptno;
DEPTNO DEPTNAME EMPNO EMPNAME DEPTNO
---------- ---------- ---------- -------------------- ----------
1 dept1 1 emp1 1
1 dept1 2 emp2 1
2 dept2 3 emp3 2
ü 笛卡爾積連線Cross Join
Cross Join是進行全匹配,兩兩之間進行笛卡爾積運算。
SQL> select * from dept
2 cross join emp
3 ;
DEPTNO DEPTNAME EMPNO EMPNAME DEPTNO
---------- ---------- ---------- -------------------- ----------
1 dept1 1 emp1 1
1 dept1 2 emp2 1
1 dept1 3 emp3 2
1 dept1 4 emp4 4
2 dept2 1 emp1 1
2 dept2 2 emp2 1
2 dept2 3 emp3 2
2 dept2 4 emp4 4
3 dept3 1 emp1 1
3 dept3 2 emp2 1
3 dept3 3 emp3 2
3 dept3 4 emp4 4
12 rows selected
SQL> select * from dept
2 cross join emp
3 where dept.deptno=emp.deptno;
DEPTNO DEPTNAME EMPNO EMPNAME DEPTNO
---------- ---------- ---------- -------------------- ----------
1 dept1 1 emp1 1
1 dept1 2 emp2 1
2 dept2 3 emp3 2
4、 結論
(+)連線是Oracle中經常使用的一種連線方法語法,從簡單可讀的角度看,似乎要比Join系列要好一些。瞭解不同型別的Join特徵,才能更好的獲取到希望的資料,用好Oracle資料庫的強大功能。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-703074/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql INNER JOIN、LEFT JOIN、RIGHT JOIN;內連線(等值連線)、左連線、右連線MySql
- Oracle表連線操作——Hash Join(雜湊連線)下Oracle
- Oracle表連線操作——Hash Join(雜湊連線)上Oracle
- Oracle 的 hash join連線方式Oracle
- ORACLE 半連線與反連線Oracle
- Oracle表連線操作——Merge Sort Join(合併排序連線)Oracle排序
- Oracle 連線因式分解(Join Factorization)Oracle
- Oracle 內外連線 join 總結Oracle
- LEFT JOIN 和JOIN 多表連線
- RMAN連線與oracle連線模式的關係Oracle模式
- 外連線(outer join)示例
- Oracle左連線,右連線Oracle
- 左連線與右連線
- 長連線與短連線
- Hibernate連線查詢join
- Oracle內連線、外連線、右外連線、全外連線小總結Oracle
- 外連線與連線順序
- Oracle 表連線方式詳解(外連結、內連線、自連線)Oracle
- 連線查詢簡析 join 、 left join 、 right join
- sql 連線查詢例項(left join)三表連線查詢SQL
- 【SQL】Oracle的內連線、左外連線、右外連線及全外連線SQLOracle
- Oracle的左連線和右連線Oracle
- 聊聊CBO的連線排列(Join Permutation)
- Http持久連線與HttpClient連線池HTTPclient
- 連結檔案 (硬連線 與 符號連線)符號
- Oracle左外連線、右外連線、完全外連線以及(+)號用法Oracle
- Oracle 左外連線、右外連線、全外連線小總結Oracle
- 內連線、左連線、右連線
- PHP 連線 OraclePHPOracle
- Servlet連線OracleServletOracle
- PHP 連線oraclePHPOracle
- jdbc連線oracleJDBCOracle
- sqlserver連線oracleSQLServerOracle
- mysql 連線oracleMySqlOracle
- navicat 連線 oracleOracle
- Oracle 表連線Oracle
- SQLSERVER 連線 ORACLESQLServerOracle
- ruby連線OracleOracle