用實驗方法加深理解Oracle的外串連(left/right/full)和內串連(inner),oracleinner

來源:互聯網
上載者:User

用實驗方法加深理解Oracle的外串連(left/right/full)和內串連(inner),oracleinner
總是對Oracle的左串連、右串連以及(+)對應的外連線類型糊塗,通過實驗加深對連線類型文法的理解。外串連分為三種:1. 左外串連,對應SQL關鍵字:LEFT (OUTER) JOIN2. 右外串連,對應SQL關鍵字:RIGHT (OUTER) JOIN3. 全外串連,對應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.
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
2. 左串連SQL> select * from left_tbl l left join right_tbl r on l.id = r.id;
        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使用(+),放右表表示左表所有記錄,再加上右表的記錄。
SQL> select * from left_tbl l, right_tbl r where r.id(+) = l.id;
        ID         ID
---------- ----------
         2          2
         3          3
         1將where條件中左右表互換,結果還是左串連,因為(+)在左邊,表示加上right表的記錄。
SQL> select * from left_tbl left join right_tbl using (id);
        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和左右串連相同,左右表匹配的記錄排在前面,並且是升序。也可以這樣寫: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將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。
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只顯示左右表都匹配的記錄。
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用=代替on是內串連另外一種用法。
總結:
1. (+)在哪個表的旁邊,就表示基表是另外一張表,結果集還需要加上(+)表中不匹配的資料。
2. 內串連inner關鍵字可省,外串連outer關鍵字可省。
3. 用on和where =都可以使用(+)方式。
oracle資料庫中外串連與內串連有什不同

內串連:返回2個表中完全合格記錄,結果集中每個表的欄位內容均來自各自的表;
外串連:返回2個表中完全合格記錄,再加上2個表中各自的記錄,結果集中的欄位只有一個表中有記錄時,另一個表中的欄位均使用空值null填寫。
例如A表:
ID user partmentID
1 aaa 3
2 bbb 3
3 ccc (null)
B表:
parmentID PartmentName
3 pm001
4 pm002
內串連結果:select A.user B.PartmentName from A inner join B on A.partmentID = B.partmentID
user PartmentName
aaa pm001
bbb pm001
外串連結果:select A.user B.PartmentName from A outer join B on A.partmentID = B.partmentID
user PartmentName
aaa pm001
bbb pm001
ccc (null) 比內串連多出來的記錄,PartmentName欄位是空值
(null) pm002 比內串連多出來的記錄,user欄位是空值

內串連在多是應用環境下使用,只有極少是使用外串連:比如同質資料的對比就可以使用外串連,比較兩人統計的同一個價格表,為了對比兩份資料的一致性,可以使用外串連。
 
Oracle 中內串連與完全外串連的不同有什?

INNER JOIN(內串連):SELECT * FROM TABLE1 T1 INNER JOIN TABLE2 T2 ON T1.ID = T2.ID
查詢時只有滿足了ID的值在倆個表同時存在,才能將此記錄查詢出來。
FULL OUTER JOIN(完全外串連):SELECT * FROM TABLE1 T1 FULL OUTER JOIN TABLE2 T2 ON T1.ID = T2.ID
查詢時TABLE1 和 TABLE2滿足內串連的記錄會統一成一條記錄查詢出來。
TABLE1中能找到ID值而在TABLE2中找不到對應的值,此時TABLE1中此記錄的值不變,其他TABLE2欄位的值補NULL,合并成一條記錄查詢出來。
反之,TABLE2中能找到ID值而在TABLE1中找不到對應的值,此時TABLE2中此記錄的值不變,其他TABLE1欄位的值補NULL,合并成一條記錄查詢出來。
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.