SQL中内连接,左连接,右连接个人的理解
????? 很久没摸SQL语句了,最近在项目中用到了SQL,又捡起SQL中的内连接,左连接,右连接温习了一下,下面谈谈对它的理解。这个例子我是用SQL Server2008做的测试。
????? 先看看一个简单的例子,有两个表TableA和TableB,两个表通过TableA的b_id列和TableB的id列连接。两个的表的如图
为做例子这两个表我添加了一些数据,如下图:
?
?我们看到TableA和TableB有数据的交集,用红色的线条表示出了。下面我们就看看用内连接,左连接,右连接查询出的不同结果。
?
内连接:
select A.id, A.value, A.b_id, B.id,B.valuefrom 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 Bwhere A.b_id = B.id
?这是查询的结果:
我们可以看到查询出的结果就是连个表的交集部分。
?
下面左连接:
Select A.id, A.value, A.b_id, B.id, B.valuefrom sales.dbo.TableA A left outer join sales.dbo.TableB B on A.b_id = B.id
?查询的结果:
?我们看到查询维度是按照TableA进行的,结果集的行数和TableA的行数是一样的,每一行中,如果TableB有对应的值则显示,如果没有则为NULL。
?
再看看右连接:
Select A.id, A.value, A.b_id, B.id, B.valuefrom sales.dbo.TableA A right outer join sales.dbo.TableB B on A.b_id = B.id
查询结果:
我们看到查询维度是按照TableB进行的,结果集的行数和TableB的行数是一样的,每一行中,如果TableA有对应的值则显示,如果没有则为NULL。
?
所以内连接,左连接,右连接查询的结果用图来表示如下:
内连接的结果是蓝色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连接的个人理解,如果有不妥的地方或者大家有什么心得欢迎讨论!