sql join相关的查询探索

sql是关系型数据库中非常重要的技术,学会写sql是开发人员必备的技术储蓄。


本章重点讲解sql中join,SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。


有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。

数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。

请看 "Persons" 表:

Id_PLastNameFirstNameAddressCity
1AdamsJohnOxford StreetLondon
2BushGeorgeFifth AvenueNew York
3CarterThomasChangan StreetBeijing



接下来请看 "Orders" 表:

Id_OOrderNoId_P
1778953
2446783
3224561
4245621
53476465

请注意,"Id_O" 列是 Orders 表中的的主键,同时,"Orders" 表中的 "Id_P" 列用于引用 "Persons" 表中的人,而无需使用他们的确切姓名。

请留意,"Id_P" 列把上面的两个表联系了起来。




情景一:

查询表A和表B中的并集数据:


表A中的数据与表B中的数据都有才能查询出来,使用inner join。

    


sql语句如下:

select 
        *
from 
          person p
inner join
          orde_  o
on 
          p.id_p = o.id_p


情景二:

包括A或者包括B的数据:


表A中的数据与表B中的数据单独查询出来,且排除非公共的部分数据,使用left/right join。


sql语句如下:

select 
        *
from 
          person p
left/right join
          orde_  o
on 
         p.id_p = o.id_p


情景三:



查询A,B中的所有数据,使用full outter join 或者 full join,很遗憾,mysql不支持。笔者测试使用的是mysql,使用union方式实现:

(select 
        *
from 
          person p
left  join
          orde_  o
on 
         p.id_p = o.id_p)

union

(select 
        *
from 
          person p
right  join
          orde_  o
on 
         p.id_p = o.id_p)

ps:union可以去除重复的结果集。



情景四:

只查询A,不包括B的集合数据,使用left excluding join。




sql语句如下:

select 
        *
from 
          person p
left  join
          orde_  o
on 
          p.id_p = o.id_p
where o.id_p is null


情景五:


同上,相反,查询B,不包括A中的数据集合。

sql语句如下:


select 
        *
from 
          person p
right  join
          orde_  o
on 
          p.id_p = o.id_p
where p.id_p is null



情景六:

查询A和B中的数据,但不包含公共的部分。

sql语句查询如下(结合情景4和情景5使用union语句):

(select 
        *
from 
          person p
left  join
          orde_  o
on 
         p.id_p = o.id_p
where o.id_p is null)

union

(select 
        *
from 
          person p
right  join
          orde_  o
on 
         p.id_p = o.id_p
where p.id_p is null)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值