SQL中内连接,左连接,右连接个人的理解

      很久没摸SQL语句了,最近在项目中用到了SQL,又捡起SQL中的内连接,左连接,右连接温习了一下,下面谈谈对它的理解。这个例子我是用SQL Server2008做的测试。

      先看看一个简单的例子,有两个表TableA和TableB,两个表通过TableA的b_id列和TableB的id列连接。两个的表的如图SQL中内连接,左连接,右连接个人的理解

为做例子这两个表我添加了一些数据,如下图:


SQL中内连接,左连接,右连接个人的理解

 

 我们看到TableA和TableB有数据的交集,用红色的线条表示出了。下面我们就看看用内连接,左连接,右连接查询出的不同结果。

 

内连接:

select A.id, A.value, A.b_id, B.id,B.value
from sales.dbo.TableA A inner join sales.dbo.TableA B on A.b_id = B.id

 或者写成下面这样,是等价的。

SELECT A.id, A.value, A.b_id, B.id,B.value 
FROM sales.dbo.TableA A,sales.dbo.TableB B
where A.b_id = B.id

 这是查询的结果:


SQL中内连接,左连接,右连接个人的理解

我们可以看到查询出的结果就是连个表的交集部分。

 

下面左连接:

Select A.id, A.value, A.b_id, B.id, B.value
from sales.dbo.TableA A left outer join sales.dbo.TableB B on A.b_id = B.id

 查询的结果:


SQL中内连接,左连接,右连接个人的理解
 我们看到查询维度是按照TableA进行的,结果集的行数和TableA的行数是一样的,每一行中,如果TableB有对应的值则显示,如果没有则为NULL。

 

再看看右连接:

Select A.id, A.value, A.b_id, B.id, B.value
from sales.dbo.TableA A right outer join sales.dbo.TableB B on A.b_id = B.id

查询结果:


SQL中内连接,左连接,右连接个人的理解

我们看到查询维度是按照TableB进行的,结果集的行数和TableB的行数是一样的,每一行中,如果TableA有对应的值则显示,如果没有则为NULL。

 

所以内连接,左连接,右连接查询的结果用图来表示如下:


SQL中内连接,左连接,右连接个人的理解
内连接的结果是蓝色C区域的部分,是两个table的数据的交集部分。

左连接是红色A区域的部分,是以TableA为维度,然后连接TableB的数据。

右连接是绿色B区域的部分,是以TableB为维度,然后连接TableA的数据。

 

 

需要说明的是,左连接和右连接的方向是相对的,我们可以这样理解:

<维度表> left outer join <事实表> on <条件>

<事实表> right outer join <维度表> on <条件>

 

所以

TableA left outer join TableB

 和

TableB right outer join TableA
 

的含义是一样的,查询出的结果也是一样的。

 

以上是我SQL连接的个人理解,如果有不妥的地方或者大家有什么心得欢迎讨论!