1. INNER JOIN(简称 JOIN)
INNER JOIN
是 SQL 中最常用的一种连接方式,默认的 JOIN
就是 INNER JOIN
。它返回两个表中满足连接条件的匹配记录。
- 作用:返回两个表中所有满足
ON
条件的记录。 - 特性:如果表中的某些行在连接条件下没有匹配的行,那么这些行将不会出现在结果集中。
例子:
SELECT * FROM TableA JOIN TableB ON TableA.ID = TableB.ID;
这将只返回 TableA
和 TableB
中 ID
字段匹配的记录。
2. OUTER JOIN
OUTER JOIN
分为三种类型:LEFT OUTER JOIN
、RIGHT OUTER JOIN
和 FULL OUTER JOIN
,它们的主要特点是即使某些行在连接条件下没有匹配的行,仍然会出现在结果集里。
-
LEFT OUTER JOIN(左外连接):返回左表(即
JOIN
中左边的表)中的所有记录,即使右表中没有匹配的行。如果右表没有匹配的行,右表的列会显示NULL
。 -
RIGHT OUTER JOIN(右外连接):返回右表(即
JOIN
中右边的表)中的所有记录,即使左表中没有匹配的行。如果左表没有匹配的行,左表的列会显示NULL
。 -
FULL OUTER JOIN(全外连接):返回两个表中的所有记录。如果左表没有匹配的行,左表的列会显示
NULL
;如果右表没有匹配的行,右表的列会显示NULL
。
2.1 LEFT OUTER JOIN (左外连接)
LEFT OUTER JOIN
返回左表的所有记录以及右表中与之匹配的记录。如果右表中没有匹配的记录,则结果中相应的右表列会显示为 NULL
。
例子:
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.ID = TableB.ID;
这将返回 TableA
中的所有记录,即使 TableB
中没有匹配的记录。如果 TableB
中没有与 TableA
中的某条记录匹配的行,TableB
中的字段将显示为 NULL
。
2.2 RIGHT OUTER JOIN (右外连接)
RIGHT OUTER JOIN
返回右表的所有记录以及左表中与之匹配的记录。如果左表中没有匹配的记录,则结果中相应的左表列会显示为 NULL
。
例子:
SELECT * FROM TableA RIGHT OUTER JOIN TableB ON TableA.ID = TableB.ID;
这将返回 TableB
中的所有记录,即使 TableA
中没有匹配的记录。如果 TableA
中没有与 TableB
中的某条记录匹配的行,TableA
中的字段将显示为 NULL
。
2.3 FULL OUTER JOIN (全外连接)
FULL OUTER JOIN
返回左表和右表的所有记录。如果某一表中没有匹配的记录,则对应的字段将显示为 NULL
。
例子:
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.ID = TableB.ID;
这将返回 TableA
和 TableB
中的所有记录。如果某一表中的记录没有匹配,另一个表的列将显示为 NULL
。
3. 总结对比:
连接类型 | 返回记录 | 说明 |
---|---|---|
INNER JOIN | 只有满足连接条件的匹配记录 | 只有在两个表中都有匹配的记录才会被返回。 |
LEFT JOIN | 返回左表的所有记录,右表的匹配记录 | 左表的所有记录都返回,右表没有匹配的会显示 NULL 。 |
RIGHT JOIN | 返回右表的所有记录,左表的匹配记录 | 右表的所有记录都返回,左表没有匹配的会显示 NULL 。 |
FULL JOIN | 返回左右表的所有记录,左表和右表的匹配记录 | 左右表所有记录都返回,没匹配的字段会显示 NULL 。 |
4. 使用场景
- INNER JOIN:当你只关心两张表中有匹配记录的情况时,使用
INNER JOIN
。 - LEFT JOIN:当你需要保留左表的所有记录,并且想知道左表记录是否在右表中有匹配时,使用
LEFT JOIN
。 - RIGHT JOIN:当你需要保留右表的所有记录,并且想知道右表记录是否在左表中有匹配时,使用
RIGHT JOIN
。 - FULL JOIN:当你需要保留两张表的所有记录时,使用
FULL JOIN
,即使它们没有匹配的记录。