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