1. 程式人生 > 其它 >Oracle SQL中join方式總結

Oracle SQL中join方式總結

在ORACLE資料庫中,表與表之間的SQL JOIN方式有多種(不僅表與表,還可以表與檢視、物化檢視等聯結)。SQL JOIN其實是一個邏輯概念,像NEST LOOP JOIN、 HASH JOIN等是表連線的物理實現方式。

為了更直觀的瞭解以上join方式,我們通過倆個測試表來進行測試,首先是建表語句:

create table U (
name varchar2(20),
gender varchar2(10)
);
create table D(
name varchar2(20),
sal number(6,0)
);
 
insert into U values('tom','male');
 
insert into U values('jerry','male');
 
insert into U values('tina','female');
 
insert into U values('ying','female');
COMMIT;
 
insert into D
select 'ying',10000 from dual union all
select 'tom',5000 from  dual union all
select 'sam',3000 from dual union all
select 'jeck',4500 from dual;
COMMIT;

內連線:INNER JOIN

內連線:也稱為等值連線,返回兩張表都滿足條件的部分

註釋:inner join 就等於 join

inner join 表示返回倆個表或記錄連線欄位的匹配記錄。它有三種實現方式,如下圖所示:

select U.NAME,U.GENDER,D.SAL
    from U inner join D on U.NAME = D.NAME;
 
              我的報表                     1
NAME                                     GENDER                      SAL
---------------------------------------- -------------------- ----------
ying                                     female                    10000
tom                                      male                       5000
select u.name,u.gender,d.sal
    from u,d
    where u.name=d.name;
 
              我的報表                     1
NAME                                     GENDER                      SAL
---------------------------------------- -------------------- ----------
ying                                     female                    10000
tom                                      male                       5000

select name, u.gender,d.sal
    from u inner join d using(name);
 
              我的報表                     1
NAME                                     GENDER                      SAL
---------------------------------------- -------------------- ----------
ying                                     female                    10000
tom                                      male                       5000

注意:inner join 可以使用簡寫join方式,如下所示,但是建議使用inner join。

select u.name,u.gender,d.sal
    from u join d
    on u.name=d.name;
 
              我的報表                     1
NAME                                     GENDER                      SAL
---------------------------------------- -------------------- ----------
ying                                     female                    10000
tom                                      male                       5000
 
select name ,u.gender,d.sal
    from u join d using(name);
 
              我的報表                     1
NAME                                     GENDER                      SAL
---------------------------------------- -------------------- ----------
ying                                     female                    10000
tom                                      male                       5000

外連結:OUTER JOIN

外連線分為外左連線(left outer join)和外右連線(right outer join)

註釋:left outer join 與 left join 等價, 一般寫成left join
right outer join 與 right join等價,一般寫成right join

1.全連線:full join

全外連線是在結果中除了顯示滿足連線的條件的行外,還顯示了join兩側表中所有滿足檢索條件的行

全連線:包含左、右倆個表的所有行,不管另一表中是否存在與其匹配的行。不符合條件的,則以空值代替。如下所示:

select u.name,u.gender,d.name,d.sal
from u full join d
on
u.name=d.name

 
              我的報表                     1
NAME       GENDER               NAME              SAL
---------- -------------------- ---------- ----------
ying       female               ying            10000
tom        male                 tom              5000
                                sam              3000
                                jeck             4500
tina       female
jerry      male
 

FULL OUTER JOIN的韋恩圖如下:

2.左外連線:LEFT JOIN

左連線,取左邊的表的全部,右邊的表按條件,符合的顯示,不符合則顯示null

舉例:select <select list> from A left join B on A.id=B.id

LEFT OUTER JOIN (with common data)韋恩圖如下:

上面是左外連線(帶公共資料)的查詢方法,那麼還有一種就是不包含的,表示如下:

左外連線:又叫左連線,意思是包含左邊表所有記錄,右邊所有匹配的記錄,如果沒有則用空補齊。換句話說就是,列出左邊表全部的,及右邊表符合條件的,不符合條件的以空值代替。

select u.name,u.gender,d.name,d.sal
from u left join d
  on u.name=d.name;
 
              我的報表                     1
NAME       GENDER               NAME              SAL
---------- -------------------- ---------- ----------
ying       female               ying            10000
tom        male                 tom              5000
tina       female
jerry      male
 
 
select u.name,u.gender,d.name,d.sal
  from u,d
  where u.name = d.name(+);
 
              我的報表                     1
NAME       GENDER               NAME              SAL
---------- -------------------- ---------- ----------
ying       female               ying            10000
tom        male                 tom              5000
tina       female
jerry      male

3.右外連線:RIGHT JOIN

右連線:取右邊的表的全部,左邊的表按條件,符合的顯示,不符合則顯示null

舉例:select <select list> from A right join B on A.id=B.id

右外連線:又叫右連結,意思是包括右邊表所有記錄,匹配左邊表的記錄,如果沒有則以空補齊。換句話說,列出右邊全部的,及左邊符合條件的,不符合條件的則以空值代替。

select u.name,u.gender,d.name,d.sal
  from u right join d
  on u.name = d.name;
 
              我的報表                     1
NAME       GENDER               NAME              SAL
---------- -------------------- ---------- ----------
tom        male                 tom              5000
ying       female               ying            10000
                                jeck             4500
                                sam              3000
 
select u.name,u.gender,d.name,d.sal
  from u,d
  where u.name(+)=d.name;
 
              我的報表                     1
NAME       GENDER               NAME              SAL
---------- -------------------- ---------- ----------
tom        male                 tom              5000
ying       female               ying            10000
                                jeck             4500
                                sam              3000

交叉連線(CROSS JOIN)

交叉連線:返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉聯接也稱作笛卡爾積

笛卡爾積

笛卡爾乘積是指在數學中,兩個集合X和Y的笛卡尓積(Cartesian product),又稱直積,表示為X × Y,第一個物件是X的成員而第二個物件是Y的所有可能有序對的其中一個成員

舉例:

現在,我們有兩個集合A和B。

A = {0,1} B = {2,3,4}

集合 A×B 和 B×A的結果集就可以分別表示為以下這種形式:

A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};

B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};

以上A×B和B×A的結果就可以叫做兩個集合相乘的‘笛卡爾積’。

從以上的資料分析我們可以得出以下兩點結論:

1,兩個集合相乘,不滿足交換率,既 A×B ≠ B×A;

2,A集合和B集合相乘,包含了集合A中元素和集合B中元素相結合的所有的可能性。既兩個集合相乘得到的新集合的元素個數是 A集合的元素個數 × B集合的元素個數;

交叉連線兩種寫法

交叉連線有兩種,顯式的和隱式的,不帶ON子句,返回的是兩表的乘積,也叫笛卡爾積。

例如:下面的語句1和語句2的結果是相同的。

語句1:隱式的交叉連線,沒有CROSS JOIN。

SELECT O.ID, O.ORDER_NUMBER, C.ID, C.NAME
FROM ORDERS O , CUSTOMERS C
WHERE O.ID=1;

語句2:顯式的交叉連線,使用CROSS JOIN。

SELECT O.ID,O.ORDER_NUMBER,C.ID,
C.NAME
FROM ORDERS O CROSS JOIN CUSTOMERS C
WHERE O.ID=1;
select * from u cross join d;
 
              我的報表                     1
NAME       GENDER               NAME              SAL
---------- -------------------- ---------- ----------
tom        male                 ying            10000
tom        male                 tom              5000
tom        male                 sam              3000
tom        male                 jeck             4500
jerry      male                 ying            10000
jerry      male                 tom              5000
jerry      male                 sam              3000
jerry      male                 jeck             4500
tina       female               ying            10000
tina       female               tom              5000
tina       female               sam              3000
 
              我的報表                     2
NAME       GENDER               NAME              SAL
---------- -------------------- ---------- ----------
tina       female               jeck             4500
ying       female               ying            10000
ying       female               tom              5000
ying       female               sam              3000
ying       female               jeck             4500