数据库中多表的连接

      连接数据库中的表进行查询、建立视图,可以大大提高去查询数据库数据的效率。连接表进行查询实际上是通过各个表之间共同列的关系来查询数据的,他是关系数据查询最重要的特性。

     数据库中的多表的连接分以下几种:


      我会按照思维导图中的顺序从上到下,依次去细化的说明。

      首先,先假设有以下这样两张表:

表名:T_N
idname
1sun
3zhang
5zhao


表名:T_S
idscore
190
370
480

1.外连接

1.1.左连接

1.1.1关键字:left join或者left outer join

1.1.2结果集描述:结果集中包括了left join子句中左表的所有行,如果左表中的某行在右表中没有匹配,那么对应的右表的行为空值null

1.1.3 sql语句及执行结果:

select   *   from  T_N  left  join  T_S  on   T_N.id=T_S.id 
 

执行结果
T_S.idnameT_S.idscore
1sun190
3zhang370
5zhaonullnull

1.2.右连接

1.2.1关键字:right join或者right outer join

1.2.2结果集描述:结果集中包括了right  join子句中右表的所有行,如果右表中的某行在左表中没有匹配,那么对应的左表的行为空值null

1.2.3 sql语句及执行结果:

select   *   from  T_N  right  join  T_S  on   T_N.id=T_S.id 

执行结果
T_N.idnameT_S.idscore
1sun190
3zhang370
nullnull480

1.3.完整外部连接

1.3.1关键字:full join或者full outer join

1.3.2结果集描述:结果集中包括了两个表的所有行,如果一个表中的某行在另一个表中没有匹配,那么对应的表的行为空值null。

1.3.3sql语句及执行结果:

select * from T_N full join T_S on T_N.id=T_S.id 

执行结果
T_N.id
name
T_S.id
score
1sun190
3zhang370
5zhaonullnull
nullnull480

2.内连接

2.1关键字:join或者inner join

2.2结果集描述:结果集中不包含两个表之间没有匹配的行,通俗点说,将那些带有null值的行去掉。

2.3 sql语句以及执行结果

select   *   from   T_N   join   T_S   on   T_N.id=T_S.id 

执行结果
T_N.id
nameT_S.id
score
1sun190
3zhang370

3.交叉连接

3.1关键字:cross join

3.2结果集描述:结果集中包含了第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。通俗点说就是第一个表中的每一行与另一个表中的每一行按照从上到下的顺序依次的连接。

3.3 sql语句及执行结果

select   *   from   T_N  cross  join   T_S  

执行结果
T_N.id
name
T_S.id
score
1sun190
3zhang190
5zhao190
1sun370
3zhang370
5zhao370
1sun480
3zhang480
5zhao480

最后的总结

       在做机房收费系统vb.net版的时候,自己碰到这样一个问题:让充值表和消费表,两个表建立一个视图,用来计算某个卡号上面的余额,但是问题是很可能有这样一种情况:卡号充值了以后,可能从来就没有消费过,所以这个卡号在消费表中的记录就是空的,当时我就在想,怎样让这个两个表连起来,在消费表里有空值的直接补null值,经过查资料(尤其是自考数据库那本书),发现了用外连接就可以做到。就是简单的换了一个关键字。这样我就建好了一个特别能提高自己效率的视图,里面的字段是已经计算好的充值总和以及消费总和,我直接去查询这个视图。就可以得到相应结果。

//建立的有外连接的充值总和、消费总和的视图
SELECT Recharge_Info.CardID, Line_info.cardID AS LcardID, SUM(Recharge_Info.AddMoney) AS sumAddMoney, SUM(Line_info.consume) AS sumConsume
FROM  Line_info RIGHT OUTER JOIN  Recharge_Info ON Line_info.cardID = Recharge_Info.CardID
GROUP BY Recharge_Info.CardID, Line_info.cardID

      在做第一遍机房收费系统的时候,没有用到外连接和视图,我大概描述那个时候计算的卡的余额的需求:先要去查充值表,将充值表的充值金额计算总和。再去查消费表,再去计算消费表的消费金额总和,再通过减法运算,才能得到最后的结果。这样要对两个表进行查询,而且还要进行运算。

      两者比较一下,是前者简单,而效率高。

      但是学习的过程,就应该先经历那些效率低,特别复杂的过程,只有通过这样一个过程,才能让自己渴望去改变自己自己的思路,从而才能获得更多的知识。


评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值