Oracle --外连接

数据库表的连接有:

1.内连接(自然连接):只有两个表相匹配的行才能在结果集中显示出来

2.外连接,包括三种:

2-1 左外连接(左表是基表,右表是匹配表,左表全部显示,右表只显示匹配的记录)

2-2 右外连接(右表是基表,左表是匹配表,右表全部显示,左表只显示匹配的记录)

2-3 全外连接(左右两表所有的记录都显示出来)

3.自连接(连接发生在一张基表内)

inner join 表示内连接;left join表示左外连接;right join表示右外连接;full join表示完全外连接。on 子句用于指定连接条件。

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

如果主表的 主键列 和从表的 外部键列 名称相同,那么可以使用 natural join 关键字自动执行内连接操作

select id,name from table1 natural join table2;

举例子

create table1(a int,b int);

create table2(a int,b int);

内连接 select * from table1 a,table2 b where a.a=b.a;

左连接 select * from table1 a,table2 b where a.a=b.a(+);

右连接 select * from table1 a,table2 b where a.a(+)=b.a;

完全连接 select * from table1 a,table2 b where a.a=b.a(+)

             union

             select * from table1 a,table2 b where a.a(+)=b.a;

笛卡尔积 select * from table1,table2;                        

如果a表有5行,b表有10行,则笛卡尔积之后一共有5*10=50行。




Oracle外连接

(1)左外连接(左边的表不加限制)

(2)右外连接(右边的表不加限制)

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

外连接(Outer Join)

外连接会返回每个满足第一个(顶端)输入与第二个(底端)输入的连接的行。它还会返回 任何在第二个输入中没有匹配行的第一个输入中的行。外连接有三种:左外连接、右外连接、全外连接,对应的SQL语句是LEFT/RIGHT/FULL OUTER JOIN。通常我们省略outer这个关键字,写成:LEFT/RIGHT/FULL  JOIN.

在左外连接和右外连接的时候都会以一张表作为基表,该表的内容会全部显示,然后在加上两张表匹配的内容。如果基表的数据在另一张表中没有记录,那么在相关联的结果集行中列显示为空值。

对于外连接,也可以使用(+)来表示,使用(+)号时要注意一些事项:

1>(+)号操作符只能出现在where子句中,并且不能和outer join语法同时使用。

2>当使用(+)操作符执行外连接时,如果在where子句中包含多个条件,则必须所有的条件都包含(+)操作符。

3>(+)操作符只适用于列,不能用在表达式上。

4>(+)操作符不能与or和in操作符一起使用.

5>(+)操作符只能用于实现左外连接和右外连接,不能用于实现完全外连接。

举例子:

这里有两张表:dava表(左表)和bi表(右表)

select * from bi;

ID     NAME

1       dave

2       bi

3       big bird

4       exc

9       怀宁

select * from dave

ID     NAME

8       安庆

1        dava

2         bl

1         bl

2         dava

3         dba

4         sf

5         dmm

1.左外连接( left join)

left join是以左边表的记录为基础,它的结果集是dave表中的数据,再加上dave表和bi表匹配的数据。话句话说,左表(dave)的记录会全部显示出来,而右表(bl)只会显示出符合搜索条件的记录,bi表记录不足的地方均为null。

写法示例:select * from dave a left join bi b on a.id=b.id;

ID   NAME        ID    NAME 

1     bl              1      dave

1     dave          1      dave

2     dave          2       bl

2     bl               2       bl

3     dba             3      big bird

4     sf                4      exc

5     dmm           --此处B表为null,没有匹配到

8     安庆             --此处B表为null,没有匹配到     

写法示例:select * from dave a left outer join bl b on a.id = b.id;

ID   NAME        ID    NAME 

1     bl              1      dave

1     dave          1      dave

2     dave          2       bl

2     bl               2       bl

3     dba             3      big bird

4     sf                4      exc

5     dmm          

8     安庆               

用(+)来实现,+号表示补充,即哪个表有+号,这个表就是匹配表。因此,加号写在右表,则右表是匹配表,左表是基表,左表全部显示,即是左连接。

写法示例:select * from dave a,bl,b where a.id=b.id(+); --注意,使用(+)就要使用关键字where

ID   NAME        ID    NAME 

1     bl              1      dave

1     dave          1      dave

2     dave          2       bl

2     bl               2       bl

3     dba             3      big bird

4     sf                4      exc

5     dmm          

8     安庆    

2.右外连接

右外连接是以右表(bl)为基础,因此,会显示bl表的所有记录,再加上dave和bl匹配的结果,dave表不足的地方使用null填充。

写法示例:select * from dave a right join bl b on a.id=b.id;

左表                 右表

ID  NAME        ID   NAME

1    dave          1    dave

2    bl              2    bl

1    bl              1    dave

2    dave          2    bl

3    dba            3    big bird

4    sf-express   4    exc

                        9    怀宁    --此处左表不足用Null 填充

(+)的写法示例:select * from dave a,bi b where a.id(+)=b.id;

左表                 右表

ID  NAME        ID   NAME

1    dave          1    dave

2    bl              2    bl

1    bl              1    dave

2    dave          2    bl

3    dba            3    big bird

4    sf-express   4    exc

                        9    怀宁

3.全外连接

左表的右表都不做限制,所有的记录都显示,两表不足的地方用null表示。全外连接不支持(+)这种写法。

写法示例:select * from dave a full join bl b on a.id=b.id;

ID   NAME               ID     NAME

8     安庆

1     dave                1        dave

2     bl                    2        bl

1     bl                    1        dave

2    dave                 2        bl

3    dba                  3        big bird

4    sf                     4        exc

5    dmm

                             9        怀宁




你可能感兴趣的:(Oracle --外连接)