日期:2014-05-16  浏览次数:20569 次

Oracle 表连接 [转]

Oracle?表之间的连接分为三种:

1.?内连接(自然连接)

2.?外连接

(1)左外连接?(左边的表不加限制)
?????? (2)右外连接(右边的表不加限制)
??????? (3)全外连接(左右两表都不加限制)

3.?自连接(同一张表内的连接)

?

?

SQL的标准语法:
select?table1.column,table2.column
from?table1?[inner?|?left?|?right?|?full?]?join?table2?on?table1.column1?=?table2.column2;

?

inner?join?表示内连接;

left?join表示左外连接;

right?join表示右外连接;

full?join表示完全外连接;
on子句?用于指定连接条件。

?

注意:

如果使用from子句指定内、外连接,则必须要使用on子句指定连接条件;
?????? 如果使用(+)操作符指定外连接,则必须使用where子句指定连接条件。

?

?

?

?

?

?

一.?内连接(Inner?Join/Join

?

?

1.1??Inner?Join?

Inner?join逻辑运算符返回满足第一个(顶端)输入与第二个(底端)输入联接的每一行。这个和用select查询多表是一样的效果,所以内连接用的很少。

还有一点要说明的就是Join?默认就是inner?join。?所以我们在写内连接的时候可以省略inner?这个关键字。?

?

?

?

1.2?下面举例来说明内连接:

1.2.1?先创建2张测试表并插入数据:

SQL>?select?*?from?dave;

ID? NAME

----------?----------

1? dave

2? bl

1? bl

2? dave

SQL>?select?*?from?bl;

ID? NAME

----------?----------

1? dave

2? bl

?

1.2.3?用内链接进行查询:

SQL>?Select?a.id,a.name,b.name?from?dave?a?inner?join?bl?b?on?a.id=b.id;???--?标准写法

????????ID?NAME???????NAME

----------?----------?----------

?????????1?dave???????dave

?????????2?bl?????????bl

?????????1?bl?????????dave

?????????2?dave???????bl

SQL>?Select?a.id,a.name,b.name?from?dave?a?join?bl?b?on?a.id=b.id;??--?这里省略了inner?关键字

????????ID?NAME???????NAME

----------?----------?----------

?????????1?dave???????dave

?????????2?bl?????????bl

?????????1?bl?????????dave

?????????2?dave???????bl

SQL>?Select?a.id,a.name,b.name?from?dave?a,bl?b?where?a.id=b.id;??--?select?多表查询

????????ID?NAME???????NAME

----------?----------?----------

?????????1?dave???????dave

?????????2?bl?????????bl

?????????1?bl?????????dave

?????????2?dave???????bl

?

???从这三个SQL?的结果我们也可以看出,他们的作用是一样的。

?

?

?

1.3?自然连接(Natural?join)

自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。

先看一下自然连接的例子:

SQL>?Select?id,name?from?dave?a?natural?join?bl?b;??

????????ID?NAME

----------?----------

?????????1?dave

?????????2?bl

?

这里我们并没有指定连接的条件,实际上oracle为我们自作主张的将,dave表中的id和name字段与bl表中的id和name字段进行了连接。也就是实际上相当于

SQL>?Select?dave.id,bl.name?From?dave?join?bl?on?dave.id?=?bl.id?and?dave.name=bl.name;

????????ID?NAME

----------?----------

?????????1?dave

?????????2?bl

?

因此,我们也可以将自然连接理解为内连接的一种。?

?

?

?

有关自然连接的一些注意事项

(1).如果做自然连接的两个表的有多个字段都满足有相同名称个类型,那么他们会被作为自然