SQL的连接分为三类:
- 外连接(包括左连接left join、右连接right join、全连接full join)
- 内连接 inner join
- 自然连接 natural join
我们来看一个超级简单的例子(下面的地址单词写错了,每个图都要重改太麻烦了):
现在有两个表,一个是student_name学生姓名
,有id和name(姓名)两个属性,一个是student_adress学生地址
,有id和adress(地址)两个属性。两个表都有 id 1,2,3
,如图:
左连接
select * from
student_name left join student_adress
on student_name.id=student_adress.id;
以id作为连接条件,左连接表示以左边这个表为基准,去匹配右边这个表,如果右边的表有同样的id,就合成一行。如果没有(比如地址表没有id5,6),缺的字段就会用NULL补齐。
右连接
select * from
student_name right join student_adress
on student_name.id=student_adress.id;
以id作为连接条件,右连接表示以右边这个表为基准,去匹配左边这个表,如果左边的表有同样的id,就合成一行。如果没有(比如姓名表没有id7,8),缺的字段就会用NULL补齐。可以和左连接的图对比着看。
全连接
select * from student_name full join student_adress ;
全连接将两个表就主键进行了一个笛卡儿积,比如姓名表id有5个,地址表id有5个,最后就会产生一个5*5行的表。
内连接
select * from
student_name inner join student_adress
on student_name.id=student_adress.id;
内连接可以使用using或on子句来指定连接条件,连接条件中指出某两字段相等(可以不同名)。内连接返回的结果是两个表中都有的字段,这里是id1,2,3。
自然连接
select * from student_name natural join student_adress ;
自然连接是通过对表关系中同名的属性对取等来完成的,无须自己添加连接条件(后面不用接on指定以什么字段连接)。自然连接和内连接的结果基本相同,都是返回两表都有的字段,这里是id1,2,3。
不同的是,看图,内连接返回的是两列id,自然连接返回的是一列id。
内连接和自然连接的区别?
一、
- 自然连接只能是同名属性的等值连接。
- 内连接可以使用using或on子句来指定连接条件,连接条件中指出某两字段相等(可以不同名)。
什么意思呢,就是说,如果现在地址表的id属性名改为了sid,而姓名表的id属性名仍然是id。如图,那么仍可以对两表进行内连接,只需要指定连接条件为 on student_name.id=student_adress.sid
就可以了。但是下面这两个表不能进行自然连接了,因为他们没有同名属性(id和sid不同名)。
二、
- 自然连接返回的同名属性列只有一列。
- 内连接返回两列。
如果此时你要进行select操作,注意!!!
自然连接 select id from student_name natural join student_adress ;可以,因为自然连接的id只有一列。
但是内连接 select id from student_name inner join student_adress on student_name.id=student_adress.id;会报错,因为内连接返回的id有两列!!!必须指明要选择的是来自哪个表的id。
改成 select student_name.id from student_name inner join student_adress on student_name.id=student_adress.id;就可以了。
可以参考SQL语句错误 Error Code: 1052. Column ‘id‘ in field list is ambiguous