Oracle內連接、左外連接、右外連接、全外連接

Oracle內連接、左外連接、右外連接、全外連接

TESTA,TESTB,TESTC,各有A, B兩列

A                     

B                      

001

10A

002

20A

A                     

B                      

001

10B

003

30B

A                     

B                      

001

10C

004

40C

連接分爲兩種:內連接與外連接。

A.內連接

內連接,即最常見的等值連接,例:

SELECT * 
FROM TESTA,TESTB
WHERE TESTA.A=TESTB.A

Oracle 支持另一種寫法

SELECT *
FROM TESTA 
INNER JOIN TESTB 
ON TESTA.A=TESTB.A

結果

A                     

B                    

A                     

B                      

001

10A

001

10B

Join連接是SQL/92標準,

還有SQL/86標準,就是直接將表寫在FROM後邊,將表連接條件與過濾條件都寫在WHERE

B.外連接

外連接分爲左外連接,右外連接和全外連接。

1.  左外連接 left outer join 或者 left join

左外連接就是在等值連接的基礎上加上主表中的未匹配數據,例:

SELECT *
FROM TESTA 
LEFT OUTER JOIN TESTB 
ON TESTA.A=TESTB.A

Oracle 支持另一種寫法

SELECT * 
FROM TESTA,TESTB
WHERE TESTA.A=TESTB.A(+)

結果:

A                      

B                    

A                     

B                     

001

10A

001

10B

002

20A

三個表做左外連接

SELECT *
FROM TESTA 
LEFT OUTER JOIN TESTB 
ON TESTA.A=TESTB.A
LEFT OUTER JOIN TESTC
ON TESTA.A=TESTC.A

Oracle 支持的另外一種寫法

SELECT *
FROM TESTA,TESTB,TESTC
WHERE TESTA.A=TESTB.A(+)
AND TESTA.A=TESTC.A(+)

結果:

A                   

B                  

A                   

B                    

A                  

B                 

001

10A

001

10B

001

10C

002

20A

2. 右外連接 right outer join 或者 right join

右外連接是在等值連接的基礎上加上被連接表的不匹配數據

SELECT *
FROM TESTA 
RIGHT OUTER JOIN TESTB 
ON TESTA.A=TESTB.A

Oracle支持的另一種寫法

SELECT *
FROM TESTA,TESTB
WHERE TESTA.A(+)=TESTB.A

結果:

A                  

B                   

A                    

B                 

001

10A

001

10B

003

30B

3.全外連接 full outer join 或者 full join

全外連接是在等值連接的基礎上將左表和右表的未匹配數據都加上

SELECT * 
FROM TESTA 
FULL OUTER JOIN TESTB
ON TESTA.A=TESTB.A

全外連接的等價寫法,對同一表先做左連接,然後右連接

SELECT  TESTA.*,TESTB.*
FROM TESTA
LEFT OUTER JOIN TESTB
ON TESTA.A=TESTB.A
UNION
SELECT
 TESTA.*,TESTB.*
FROM TESTB
LEFT OUTER JOIN TESTA
ON TESTA.A=TESTB.A

結果:

A                     

B                      

A                      

B                    

001

10A

001

10B

002

20A

003

30B


原文:http://www.blogjava.net/hello-yun/archive/2011/04/08/347890.html


Oracle關聯查詢中的ON與WHERE

A、C兩表數據如下:


ON、AND過濾:

--第一步,on表示通過什麼字段關聯,第二步,and表示關聯的時候c.a=1,所以只有c.a=1的記錄關聯上出來了。
--那麼爲什麼a表的其他三條數據也出來了?因爲這是左關聯,不管最後的數據怎樣,左邊的主表數據都會出來。


--同理,限制a.a=1也是一樣的,只會關聯出a.a=1的數據,其他a表的所有數據都會出來,但是不會關聯上,與不加a.a='1'的對比下想想。


這是不加a.a='1'的結果,對比下。


--總結,通過and條件,只會限制關聯的數據(關聯時限制關聯上的數據,關聯不上的主表數據仍會出來)

WHERE:

WHERE就不多說了,大家都很熟悉。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章