SQL的JOIN和不同类型的JOINs
什么是SQL JOIN
?
SQL JOIN
是从两个或多个数据库表中检索数据的一种方法。
SQL JOIN
有哪些不同的方式?
总共有五种JOIN
,分别是:
1. JOIN or INNER JOIN 2. OUTER JOIN 2.1 LEFT OUTER JOIN or LEFT JOIN 2.2 RIGHT OUTER JOIN or RIGHT JOIN 2.3 FULL OUTER JOIN or FULL JOIN 3. NATURAL JOIN 4. CROSS JOIN 5. SELF JOIN
1. JOIN或INNER JOIN:
在这种类型的JOIN
中,我们获取符合两个表中条件的所有记录,并且不符合匹配条件的表中的记录不会被报告。
换句话说,INNER JOIN
基于这样一个单一的事实:仅列出BOTH表中匹配的条目。
请注意,没有任何其他JOIN
关键字(如INNER
,OUTER
,LEFT
等)的JOIN
是INNER JOIN
。换句话说,JOIN
是INNER JOIN
的语法糖(参见:JOIN和INNER JOIN的区别)。
2. OUTER JOIN:
OUTER JOIN
检索
要么,
一个表中的匹配行和另一个表中的所有行
要么,
所有表中的所有行(无论是否有匹配项)。
有三种Outer Join:
2.1 LEFT OUTER JOIN or LEFT JOIN
此连接将返回左表中的所有行以及右表中的匹配行。如果右表中没有匹配的列,则返回NULL
值。
2.2 RIGHT OUTER JOIN or RIGHT JOIN
此连接将返回右表中的所有行以及左表中的匹配行。如果左表中没有匹配列,则返回NULL
值。
2.3 FULL OUTER JOIN or FULL JOIN
此连接组合了LEFT OUTER JOIN
和RIGHT OUTER JOIN
。当条件满足时,它从任一表中返回行,并在没有匹配项时返回NULL
值。
换句话说,OUTER JOIN
基于这样一个事实:仅列出一个表(右表或左表)或两个表(FULL)中的匹配条目。
Note that `OUTER JOIN` is a loosened form of `INNER JOIN`.
3. NATURAL JOIN:
它基于两个条件:
- 使用相同名称的所有列进行等式比较的
JOIN
。 - 从结果中删除重复的列。
这似乎更多是理论性的,因此(可能)大多数DBMS甚至不费心支持它。
4. CROSS JOIN:
它是涉及两个表的笛卡尔积。在大多数情况下,CROSS JOIN
的结果是没有意义的。此外,我们根本不需要此功能(或需要较少的功能)。
5. 自连接:
它不是一个不同种类的JOIN
, 而是把一张表自身进行JOIN
(INNER
, OUTER
, 等等)。
基于运算符的JOIN
根据JOIN
子句使用的运算符,有两种类型的JOIN
:
- 等值连接(Equi JOIN)
- Theta JOIN
1. 等值连接(Equi JOIN):
无论哪种JOIN
类型(INNER
, OUTER
, 等等),如果仅使用等号(=),我们就说JOIN
是等值连接(EQUI JOIN)
。
2. Theta JOIN:
这与等值连接(EQUI JOIN)
相同,但它允许所有其他运算符,如>、<、>= 等等。
许多人认为
等值连接(EQUI JOIN)
和ThetaJOIN
与INNER
,OUTER
等JOIN
类似。但我强烈认为这是一个错误,会让想法变得模糊不清。因为内连接
、外连接
等都与表和它们的数据相关,而等值连接(EQUI JOIN)
和Theta JOIN
仅与我们在前者中使用的运算符相关联。同样,有许多人认为
自然链接(NATURAL JOIN)
是某种“奇特的”等值连接(EQUI JOIN)
。事实上,这是正确的,因为我提到自然链接(NATURAL JOIN)
的第一个条件。但是,我们不必仅限于自然链接(NATURAL JOIN)
。内连接
,外连接
等也可以是等值连接(EQUI JOIN)
。