用實驗方法加深理解Oracle的外連線(left/right/full)和內連線(inner)
總是對Oracle的左連線、右連線以及(+)對應的外連線型別糊塗,透過實驗加深對連線型別語法的理解。外連線分為三種:
1. 左外連線,對應SQL關鍵字:LEFT (OUTER) JOIN
2. 右外連線,對應SQL關鍵字:RIGHT (OUTER) JOIN
3. 全外連線,對應SQL關鍵字:FULL (OUTER) JOIN
左右外連線都是以一張表為基表,在顯示基表所有記錄外,加上另外一張表中匹配的記錄。如果基表的資料在另一張表中沒有記錄,那麼相關聯的結果集行中顯示為空值。
精確點說,引用MOS:
對於左連線,將會返回join連線條件中第一次提到的表(或者”左邊“的表)。
對於右連線,將會返回join連線條件中第二次提到的表(或者”右邊“的表)。
實驗:
1. 準備:
SQL> create table left_tbl(id number);
Table created.
SQL> create table right_tbl(id number);
Table created.
Table created.
SQL> create table right_tbl(id number);
Table created.
insert into left_tbl values(1);
insert into left_tbl values(2);
insert into left_tbl values(3);
insert into right_tbl values(2);
insert into right_tbl values(3);
insert into right_tbl values(6);
SQL> select * from left_tbl;
ID
----------
1
2
3
SQL> select * from right_tbl;
ID
----------
2
3
6
ID
----------
1
2
3
SQL> select * from right_tbl;
ID
----------
2
3
6
2. 左連線
SQL> select * from left_tbl l left join right_tbl r on l.id = r.id;
ID ID
---------- ----------
2 2
3 3
1
ID ID
---------- ----------
2 2
3 3
1
從排序看,左右表匹配的記錄排在前面,並且是升序。
也可以這樣寫:select * from left_tbl l left join right_tbl r on l.id = r.id(+);
SQL> select * from left_tbl l, right_tbl r where l.id = r.id(+);
ID ID
---------- ----------
2 2
3 3
1
ID ID
---------- ----------
2 2
3 3
1
使用(+),放右表表示左表所有記錄,再加上右表的記錄。
SQL> select * from left_tbl l, right_tbl r where r.id(+) = l.id;
ID ID
---------- ----------
2 2
3 3
1
ID ID
---------- ----------
2 2
3 3
1
將where條件中左右表互換,結果還是左連線,因為(+)在左邊,表示加上right表的記錄。
SQL> select * from left_tbl left join right_tbl using (id);
ID
----------
2
3
1
ID
----------
2
3
1
此處使用using,只顯示了左表的記錄。
3. 右連線
SQL> select * from left_tbl l right join right_tbl r on l.id = r.id;
ID ID
---------- ----------
2 2
3 3
6
ID ID
---------- ----------
2 2
3 3
6
和左右連線相同,左右表匹配的記錄排在前面,並且是升序。
也可以這樣寫:select * from left_tbl l right join right_tbl r on l.id(+) = r.id;
SQL> select * from left_tbl l, right_tbl r where l.id(+) = r.id;
ID ID
---------- ----------
2 2
3 3
6
使用(+),放左表表示右表所有記錄,再加上左表的記錄。
SQL> select * from left_tbl l, right_tbl r where r.id = l.id(+);
ID ID
---------- ----------
2 2
3 3
6
ID ID
---------- ----------
2 2
3 3
6
將where條件中左右表互換,結果還是右連線,因為(+)在右邊,表示加上left表的記錄。
4. 全外連線
SQL> select * from left_tbl l full join right_tbl r on l.id = r.id;或select * from left_tbl l full outer join right_tbl r on l.id = r.id;
ID ID
---------- ----------
2 2
3 3
1
6
會顯示左右表的記錄,不匹配的用NULL。
ID ID
---------- ----------
2 2
3 3
1
6
會顯示左右表的記錄,不匹配的用NULL。
5. 內連線
說了外連線,再看下內連線,innser join或join。
SQL> select * from left_tbl l inner join right_tbl r on l.id = r.id;
ID ID
---------- ----------
2 2
3 3
用inner join只顯示左右表都匹配的記錄。
ID ID
---------- ----------
2 2
3 3
用inner join只顯示左右表都匹配的記錄。
SQL> select * from left_tbl l join right_tbl r on l.id = r.id;
ID ID
---------- ----------
2 2
3 3
直接用join和inner join相同。
SQL> select * from left_tbl l, right_tbl r where l.id = r.id;
ID ID
---------- ----------
2 2
3 3
ID ID
---------- ----------
2 2
3 3
用=代替on是內連線另外一種用法。
總結:
1. (+)在哪個表的旁邊,就表示基表是另外一張表,結果集還需要加上(+)表中不匹配的資料。
2. 內連線inner關鍵字可省,外連線outer關鍵字可省。
3. 用on和where =都可以使用(+)方式。
1. (+)在哪個表的旁邊,就表示基表是另外一張表,結果集還需要加上(+)表中不匹配的資料。
2. 內連線inner關鍵字可省,外連線outer關鍵字可省。
3. 用on和where =都可以使用(+)方式。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30936525/viewspace-2016734/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql INNER JOIN、LEFT JOIN、RIGHT JOIN;內連線(等值連線)、左連線、右連線MySql
- 【SQL】Oracle的內連線、左外連線、右外連線及全外連線SQLOracle
- 兩種連線的表達 :left(right) join 和 (+)
- Oracle內連線、外連線、右外連線、全外連線小總結Oracle
- 深入理解SQL的四種連線-左外連線、右外連線、內連線、全連線SQL
- sql 內連線和外連線SQL
- 內連線、外連線
- SQL的四種連線:內連線 左外連線 右外連線 全連線SQL
- Oracle 表連線方式詳解(外連結、內連線、自連線)Oracle
- mysql常用連線查詢join,left,right,crossMySqlROS
- [20170203]12c left right 外連線的增強
- 內連線、外連線總結
- 連線查詢簡析 join 、 left join 、 right join
- SQL Server中內連線和外連線的區別SQLServer
- 例項解析外連線 內連線 自連線 全連線
- oracle sql內連線_左(右)連線_全外連線_幾種寫法OracleSQL
- MYSQL語法:左連線、右連線、內連線、全外連線MySql
- MySQL筆記3——內連線/外連線、多表連線MySql筆記
- Oracle左外連線、右外連線、完全外連線以及(+)號用法Oracle
- Oracle 左外連線、右外連線、全外連線小總結Oracle
- sql和hql中join語句區別,以及hibernate中內連線,迫切內連線,左外連線,迫切左外連線,右外連線的區別(合集)...SQL
- LEFT JOIN 和JOIN 多表連線
- not in 用外連線實現
- sql內連結,外連線SQL
- Oracle 內外連線 join 總結Oracle
- 【FULL OUTER JOIN】全外連線的union all改寫方法
- oracle外連線Oracle
- 外連線轉換為內連線的情況
- 轉載:內連線與外連線的區別
- 【SQL】13 SQL 別名、SQL 連線(JOIN)、SQL INNER JOIN 關鍵字、SQL LEFT JOIN 關鍵字、SQL RIGHT JOIN 關鍵字、SQL FULL OUTER JSQL
- MySQL LEFT JOIN/ INNER JOIN/RIGHT JOINMySql
- Oracle的左連線和右連線Oracle
- oracle 外連線的使用Oracle
- 行的儲存(塊內連線與塊外連線)
- 資料庫外連線,自然連線,內連線,條件連線,等值連線關係及詳解資料庫
- 內連線、左連線、右連線
- 你真的會玩SQL嗎?內連線、外連線SQL
- Oracle的表連線方法(三)雜湊連線Oracle