sql数据库表连接,主要分为:内连接、外连接(左连接、右连接 、全连接)、交叉连接,今天统一整合一下,看看他们的区别。
首先建表填充值。
学生表:student(id,姓名,年龄,性别 )
![](https://images2015.cnblogs.com/blog/509839/201606/509839-20160626164059375-1193739108.png)
![](file:///C:/Users/dell/AppData/Local/YNote/data/janneyhu165@163.com/5344ec23842c436badeb61820053e5e5/clipboard.png)
成绩表:score(id,学生id,成绩)
![](https://images2015.cnblogs.com/blog/509839/201606/509839-20160626164112688-1033118728.png)
![](file:///C:/Users/dell/AppData/Local/YNote/data/janneyhu165@163.com/c5bbbff3518d4766b93cdfce481f7e0f/clipboard.png)
一、内连接(inner join……on)
select student.* ,Score.* from student inner join Score on student.id=Score.sid
查询结果如下:
![](https://images2015.cnblogs.com/blog/509839/201606/509839-20160626164128031-1210043406.png)
![](file:///C:/Users/dell/AppData/Local/YNote/data/janneyhu165@163.com/d5e8eb8c611041c89cc3e75cf31abffe/clipboard.png)
关系如下图:
![](https://images2015.cnblogs.com/blog/509839/201606/509839-20160626164151516-1380907588.png)
![](file:///C:/Users/dell/AppData/Local/YNote/data/janneyhu165@163.com/52df7d6ef3cc4d9caf2485415c863d2a/clipboard.png)
总结:inner join取两表的交集。
二、外连接
外连接包括 左连接、右连接、全连接 (left|right | full outer join ……on),其中outer可以省略
(1)左连接(left join ……on)
select student.* ,Score.* from student left join Score on student.id=Score.sid
查询结果如下:
![](https://images2015.cnblogs.com/blog/509839/201606/509839-20160626164342703-2049674851.png)
![](file:///C:/Users/dell/AppData/Local/YNote/data/janneyhu165@163.com/86ad9efcf91540afb8f984f4bad0456f/clipboard.png)
关系如下图:
![](https://images2015.cnblogs.com/blog/509839/201606/509839-20160626164352985-1965760602.png)
![](file:///C:/Users/dell/AppData/Local/YNote/data/janneyhu165@163.com/f5b4fbc7a70748ba87eddcc258c7d94f/clipboard.png)
总结:left join 以左表为准,查询出左表的所有数据,右表中有对应的则显示出来,没有对应的则显示为null.
注:A left join B on 与 A,B where 有相同效果,如下:
select student.* ,Score.* from student inner join Score on student.id=Score.sid
select student.* ,Score.* from student,Score where student.id=Score.sid
(2)右连接(right join ……on)
select student.* ,Score.* from student right join Score on student.id=Score.sid
![](https://images2015.cnblogs.com/blog/509839/201606/509839-20160626164411141-543311179.png)
![](file:///C:/Users/dell/AppData/Local/YNote/data/janneyhu165@163.com/4ffea53f20d24abe933dca30fe27077c/clipboard.png)
关系如下图:
![](https://images2015.cnblogs.com/blog/509839/201606/509839-20160626164423547-239123338.png)
![](file:///C:/Users/dell/AppData/Local/YNote/data/janneyhu165@163.com/c766c21aec0d442681ceb7be28c3bb9c/clipboard.png)
总结:right join 以右表为准,查询出右表的所有数据,左表中有对应的则显示出来,没有对应的则显示为null.
(3)全连接(full join ……on)
select student.* ,Score.* from student full join Score on student.id=Score.sid
![](https://images2015.cnblogs.com/blog/509839/201606/509839-20160626164444406-778769618.png)
![](file:///C:/Users/dell/AppData/Local/YNote/data/janneyhu165@163.com/fd1a590ef4a74251b11abefc35d5a1e3/clipboard.png)
总结:full join 是为left和right的集合,某表中某一行在另一表中无匹配行,则相应列的内容为NULL。
三、交叉连接(cross join),注意没有on条件
select student.* ,Score.* from student cross join Score
![](https://images2015.cnblogs.com/blog/509839/201606/509839-20160626164459047-1658452893.png)
![](file:///C:/Users/dell/AppData/Local/YNote/data/janneyhu165@163.com/b7bfa8d98d934ce3821875fbc133555a/clipboard.png)
叉联接也称作笛卡尔积。相当于两个表中的所有行进行排列组合。
若表a有X行,表b有Y行,则将返回XY行记录。