SQL中的各种join
SQL中有各种join操作,例如 inner join, outer join, full join, cross join, natural join等。
-----------------------------------------------------------------------------
inner join内连接 也是最普通的join操作。只有join的两个属性值满足join条件后才能生成新的元组。类似于条件连接。例如select *
from tableA inner join tableB on tableA.attributeA = tableB.attributeB 等价于
select * from tableA join tableB on tableA.attributeA = tableB.attributeB也等价于
select * from tableA, tableB where tableA.attributeA = tableB.attributeB
tableA
id attributeA
1 1
2 2
tableB
id attributeB
1 2
3 3
最终结果
tableA.id tableB.id attributeA attributeB
2 1 2 2
-----------------------------------------------------------------------------
outer join外连接,分为left outer join(简写为left join)和 right outer join*(简写为right join
),左右外连接可以保存一边的所有元组值。即使join的两个属性值不满足join的条件,依然能留下一个表的元组,另外一半属性就填充为NULL.例如tableA
.attributeA = tableB.attributeB为连接条件。可是tableA.attributeA含有X值,但是tableB.attribut
eB却没有X值。如果直接使用inner join,
含X值的元组就会被丢弃。如果我们想在结果中保留tableA.attributeA的X类似的元组,拿上面的例子来说如果我想保留tableA中的1
1元组。那么就是用类似于下面的SQL: select * from tableA left join tableB on tableA.attributeA
= tableB.attributeB 等价于 select * from tableB right join tableA on
tableA.attributeA = tableB.attributeB, left join 是保留左边表的元组,right
join是保留右边表的元组。
最终结果为:
tableA.id attributeA tableB.id attributeB
1 1 null null
2 2 1 2
-----------------------------------------------------------------------------
full join 全连接(或者为full outer join),left/right join只能保留一边的表元组,full
join可以保留两边表的元组。select * from tableA full join tableB on tableA.attributeA =
tableB.attributeB
最终结果为:
tableA.id attributeA tableB.id attributeB
1 1 null null
2 2 1 2
null null 3 3
-----------------------------------------------------------------------------
cross join笛卡尔积,这个就是每一个A中元组和每个B中元组拼接成新的元组。
最终结果为:
tableA.id attributeA tableB.id attributeB
1 1 1 2
1 1 3 3
2 2 1 2
2 2 3 3
-----------------------------------------------------------------------------
natural join自然连接。这个是将两个表的公共属性做连接,同名公共属性只保留一份在最终结果里。例如tableA和tableB中都有id字段,自然连接
后,结果里只保留一个id字段。例如select * from tableA natural join tableB
最终结果为:
id attributeA attributeB
1 1 2
-----------------------------------------------------------------------------
半连接。貌似没有半连接对应的SQL关键字。半连接就是保留一张表参与连接的元组。所以我们可以再连接之后加入字段的选择。例如select attributeA
from tableA join tableB on tableA.attributeA = tableB.attributeB.
最终结果为:
id attributeA
2 2
-----------------------------------------------------------------------------
自连接,这个名字我不记得在哪里见过。不过传说是有的。和其他join操作不一样之处在于自连接要加入distinct关键字,所以SQL类似于select
distinct attributeA from tableA cross join tableB
最终结果为:
attributeA
1
2