1,各种连接之间的区分
笛卡尔积(下面两种写法等价)
select * from t1,t2;
select * from t1 join t2;
自然连接:在笛卡尔积的基础上筛选所有同名称属性相等的行。
select * from t1 natural join t2;
内连接:在笛卡尔积的基础上筛选两表id相等的行,与自然连接等价,并且在此连接中,on后面的and跟where等价。
select * from t1 inner join t2 on t1.id=t2.id
外连接(left,right,full):此连接中on后面的and与where是不等价的。
select * from t1 left join t2 on t1.id=t2.id and t1.name='zhang'
2,各种连接的实质
上述连接中的后三者都是在自然连接的基础上筛选而来,形成的流程如下:
表t1: 表t2:
以最复杂的下面这条连接来说明:
select * from t1 left join t2 on t1.id=t2.id and t1.name='li' where t1.id<>3
流程1:得到笛卡尔积
流程2:根据
t1
.
id
=
t2
.
id
and
t1
.
name
=
'li'
条件去筛选1中的结果
流程3:根据左连接的特殊性,把t1中没有匹配的行列出来,右边补null就可以了(
注意:此时会把重复的行删掉,比如t2中多一行(3 wa),但最终结果只有一条(3 wang null null))
流程4:如果后面还有where语句的话就在3的基础上刷选就ok了。