在实际项目中对数据库进行查询是再常见不过的东西了,但是根据不同的条件查询所用的语句也是千差万别的,最常见的便是数据库中多表之间的联合查询。说到联合查询就不得不提一下查询语句中的表连接关系。我们所用的多表查询语句中表间关系无非有两种,一种为内连接(inner join),另一种为外连接(outer join)。具体细分一下外连接又可分为:左外连接(left join)、右外连接(right join)、全连接(full join),另外还常见的形式有left outer join,right outer join,full outer join。他们之间的具体关系可以下图简单表示:
最近在做系统的过程中用到了不同的查询方式,这里简单总结一下:
首先要说明的是外连接中outer与非outer之间的关系。很多人都使用过left outer join或者是left join,但是多数人没有想过这两者之间究竟有没有区别。很不幸的告诉大家left outer join和left join之间其实是没有本质区别的,outer只是left join的一个属性,outer的存在只是显示的给出了left join的属性,如果没有的话默认的属性也是为outer的,他们两个在查询结果的实现上是没有区别的,right join与right outer join以及full join与full outer join之间的关系也是如此,所以在此我们只介绍inner join、left join、right join和full join四种关系即可。
一、对比理解inner join和 full join
对这两个连接关系的理解我们可以借助于数学上的交并集。Inner join也就是内连接,要求的是多表之间必须同时都满足两表之间的对接条件才能查出结果,也就是说按照对接关系(即on条件)查出的结果必须是多表之间的交集,不满足on条件将会被过滤掉,可以理解为数学上的add条件。Out join与inner join却恰恰相反,它所查出来的结果是两表各自按条件查询结果的并集,outer join的存在,相当于数学上的or条件。
二、对比理解left join和right join
Left join和right join最大的区别在于它确定了以哪个表为查询结果基准。Left join确定以左边表为基准,也就是join字符前的那张表,而right join确定以右边表为基准,即join字符后的那张表。进行查询时首先按照基准表的查询结果确定记录条数然后再根据条件查询非基准表。具体用法以下例说明:
表一:TableOne(别名为TO)
ID |
A |
B |
C |
1 |
A1 |
B1 |
C1 |
2 |
A2 |
B2 |
C2 |
3 |
A3 |
B3 |
C3 |
表二:TableTwo(别名为TT)
ID |
D |
E |
1 |
D1 |
E1 |
2 |
D2 |
E2 |
4 |
D4 |
E4 |
请注意两表中的ID号的区别。
Inner join:
Select TO.A , TO.B , TT.D , TT.E fromTableOne TO inner join TableTwo TT on TO.ID=TT.ID
其查询结果为:
A |
B |
D |
E |
A1 |
B1 |
D1 |
E1 |
A2 |
B2 |
D2 |
E2 |
Left join:
Select TO.A , TO.B , TT.D ,TT.E fromTableOne TO left join TableTwo TT on TO.ID=TT.ID
其查询结果为:
A |
B |
D |
E |
A1 |
B1 |
D1 |
E1 |
A2 |
B2 |
D2 |
E2 |
A3 |
B3 |
NULL |
NULL |
Right join:
Select TO.A , TO.B , TT.D ,TT.E fromTableOne TO right join TableTwo TT on TO.ID=TT.ID
其查询结果为:
A |
B |
D |
E |
A1 |
B1 |
D1 |
E1 |
A2 |
B2 |
D2 |
E2 |
NULL |
NULL |
D4 |
E4 |
Full join:
Select TO.A , TO.B , TT.D ,TT.E fromTableOne TO full join TableTwo TT on TO.ID=TT.ID
其查询结果为:
A |
B |
D |
E |
A1 |
B1 |
D1 |
E1 |
A2 |
B2 |
D2 |
E2 |
A3 |
B3 |
NULL |
NULL |
NULL |
NULL |
D4 |
E4 |