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.id | name | T_S.id | score |
1 | sun | 1 | 90 |
3 | zhang | 3 | 70 |
null | null | 4 | 80 |
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 |
1 | sun | 1 | 90 |
3 | zhang | 3 | 70 |
5 | zhao | null | null |
null | null | 4 | 80 |
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 | name | T_S.id | score |
1 | sun | 1 | 90 |
3 | zhang | 3 | 70 |
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 |
1 | sun | 1 | 90 |
3 | zhang | 1 | 90 |
5 | zhao | 1 | 90 |
1 | sun | 3 | 70 |
3 | zhang | 3 | 70 |
5 | zhao | 3 | 70 |
1 | sun | 4 | 80 |
3 | zhang | 4 | 80 |
5 | zhao | 4 | 80 |
最后的总结
在做机房收费系统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
在做第一遍机房收费系统的时候,没有用到外连接和视图,我大概描述那个时候计算的卡的余额的需求:先要去查充值表,将充值表的充值金额计算总和。再去查消费表,再去计算消费表的消费金额总和,再通过减法运算,才能得到最后的结果。这样要对两个表进行查询,而且还要进行运算。
两者比较一下,是前者简单,而效率高。
但是学习的过程,就应该先经历那些效率低,特别复杂的过程,只有通过这样一个过程,才能让自己渴望去改变自己自己的思路,从而才能获得更多的知识。