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.attributeB却没有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

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值