原文链接:https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
![](https://img.haomeiwen.com/i16430024/3868189bb6a4bce0.jpg)
![](https://img.haomeiwen.com/i16430024/34585971dfa74230.jpg)
![](https://img.haomeiwen.com/i16430024/5ac96ea6b2cc718e.jpg)
1.Left JOIN (左连接)
![](https://img.haomeiwen.com/i16430024/2161e477019dc959.jpg)
该查询将返回左表(表A)中的所有记录,而不管这些记录是否与右表(表B)中的任何记录相匹配。它还将返回右表中的任何匹配记录。这个连接写法如下:
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
![](https://img.haomeiwen.com/i16430024/a2c25f1daeec90a2.jpg)
2.Right JOIN(右连接)
![](https://img.haomeiwen.com/i16430024/eeecd527ab09128b.jpg)
该查询将返回右表(表B)中的所有记录,而不管这些记录是否与左表(表a)中的任何记录相匹配。它还将返回左表中的任何匹配记录。这个连接写如下:
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
![](https://img.haomeiwen.com/i16430024/ef2e4dc655746240.jpg)
3.Inner JOIN (内连接)
![](https://img.haomeiwen.com/i16430024/8108367f99c4950e.jpg)
这是最简单、最容易理解的连接,也是最常见的连接。这个查询将返回左表(表A)中与右表(表B)中有匹配记录的所有记录。
SELECT <select_list>
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key
![](https://img.haomeiwen.com/i16430024/4e3da35e85775bac.jpg)
4.Left Excluding JOIN(左连接不包含内连接)
![](https://img.haomeiwen.com/i16430024/45b1ad620990cbfe.jpg)
这个查询将返回左表(表A)中所有与右表(表B)中任何记录不匹配的记录。
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL
![](https://img.haomeiwen.com/i16430024/defcca6928bc02be.jpg)
5.Right Excluding JOIN(右连接不包含内连接)
![](https://img.haomeiwen.com/i16430024/493a06cd11a1a643.jpg)
这个查询将返回右表(表B)中与左表(表A)中任何记录不匹配的所有记录。
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL
![](https://img.haomeiwen.com/i16430024/96c38dc2df50e085.jpg)
6.Outer Excluding JOIN
![](https://img.haomeiwen.com/i16430024/60294e10d33975d6.jpg)
这个查询将返回左表(表A)中的所有记录和右表(表B)中的所有不匹配的记录。我还需要使用这种类型的连接,但是我经常使用其他所有类型的连接。这个连接写法如下:
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL
由于mysql不支持full join,只能通过下面代码模拟实现
SELECT * FROM stu_movie A LEFT JOIN stu_student B ON A.cid = B.cid WHERE B.cid IS NULL UNION ALL SELECT * FROM stu_movie A RIGHT JOIN stu_student B ON A.cid = B.cid WHERE A.cid IS NULL;
![](https://img.haomeiwen.com/i16430024/9a7451283ebb0fa0.jpg)
7.Outer JOIN(外连接、全连接)
![](https://img.haomeiwen.com/i16430024/3b125bd041a3d29f.jpg)
此联接也可以称为完整的外部联接或完整联接。这个查询将返回来自两个表的所有记录,连接来自左表(表A)的记录,这些记录与来自右表(表B)的记录相匹配。
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
上面代码在mysql执行是报错的,因为mysql不支持全连接,只能用以下代码实现效果,含义是左连接+右连接+去重=全连接:
SELECT A.cid AS A_cid,B.cid AS B_cid FROM stu_movie A LEFT JOIN stu_student B ON A.cid = B.cid UNION SELECT A.cid AS A_cid,B.cid AS B_cid FROM stu_movie A RIGHT JOIN stu_student B ON A.cid= B.cid
![](https://img.haomeiwen.com/i16430024/43b34cbb620685c4.jpg)
网友评论