oracle内连接、外连接、左外连接、右外连接、全外连接
数据库版本:Oracle 9i
表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
结果
A
B
A
B
001
10A
001
10B
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