SQL连接的可视化表示
原文链接:https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins



1.Left JOIN (左连接)

该查询将返回左表(表A)中的所有记录,而不管这些记录是否与右表(表B)中的任何记录相匹配。它还将返回右表中的任何匹配记录。这个连接写法如下:
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key

2.Right JOIN(右连接)

该查询将返回右表(表B)中的所有记录,而不管这些记录是否与左表(表a)中的任何记录相匹配。它还将返回左表中的任何匹配记录。这个连接写如下:
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key

3.Inner JOIN (内连接)

这是最简单、最容易理解的连接,也是最常见的连接。这个查询将返回左表(表A)中与右表(表B)中有匹配记录的所有记录。
SELECT <select_list>
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key

4.Left Excluding JOIN(左连接不包含内连接)

这个查询将返回左表(表A)中所有与右表(表B)中任何记录不匹配的记录。
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

5.Right Excluding JOIN(右连接不包含内连接)

这个查询将返回右表(表B)中与左表(表A)中任何记录不匹配的所有记录。
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL

6.Outer Excluding JOIN

这个查询将返回左表(表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;

7.Outer JOIN(外连接、全连接)

此联接也可以称为完整的外部联接或完整联接。这个查询将返回来自两个表的所有记录,连接来自左表(表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
