SQL的JOIN和不同类型的JOINs

29 浏览
0 Comments

SQL的JOIN和不同类型的JOINs

什么是 SQL JOIN,有哪些不同的类型?

admin 更改状态以发布 2023年5月21日
0
0 Comments

什么是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关键字(如INNEROUTERLEFT等)的JOININNER JOIN。换句话说,JOININNER 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 JOINRIGHT OUTER JOIN。当条件满足时,它从任一表中返回行,并在没有匹配项时返回NULL值。

换句话说,OUTER JOIN基于这样一个事实:仅列出一个表(右表或左表)或两个表(FULL)中的匹配条目。

Note that `OUTER JOIN` is a loosened form of `INNER JOIN`.

3. NATURAL JOIN:

它基于两个条件:

  1. 使用相同名称的所有列进行等式比较的JOIN
  2. 从结果中删除重复的列。

这似乎更多是理论性的,因此(可能)大多数DBMS甚至不费心支持它。

4. CROSS JOIN:

它是涉及两个表的笛卡尔积。在大多数情况下,CROSS JOIN的结果是没有意义的。此外,我们根本不需要此功能(或需要较少的功能)。

5. 自连接:

它不是一个不同种类的JOIN, 而是把一张表自身进行JOININNER, OUTER, 等等)。

基于运算符的JOIN

根据JOIN子句使用的运算符,有两种类型的JOIN

  1. 等值连接(Equi JOIN)
  2. Theta JOIN

1. 等值连接(Equi JOIN):

无论哪种JOIN类型(INNER, OUTER, 等等),如果仅使用等号(=),我们就说JOIN等值连接(EQUI JOIN)

2. Theta JOIN:

这与等值连接(EQUI JOIN)相同,但它允许所有其他运算符,如>、<、>= 等等。

许多人认为等值连接(EQUI JOIN)和Theta JOININNER, OUTERJOIN类似。但我强烈认为这是一个错误,会让想法变得模糊不清。因为内连接外连接等都与表和它们的数据相关,而等值连接(EQUI JOIN)Theta JOIN仅与我们在前者中使用的运算符相关联。

同样,有许多人认为自然链接(NATURAL JOIN)是某种“奇特的”等值连接(EQUI JOIN)。事实上,这是正确的,因为我提到自然链接(NATURAL JOIN)的第一个条件。但是,我们不必仅限于自然链接(NATURAL JOIN)内连接外连接等也可以是等值连接(EQUI JOIN)

0
0 Comments

来自的图示:


INNER JOIN - 仅返回两个表中符合条件的记录


LEFT JOIN - 返回表1中所有记录以及与表2中符合条件的记录


RIGHT JOIN - 返回表2中所有记录以及与表1中符合条件的记录


FULL OUTER JOIN - 返回左右外连接中符合ON条件的记录,并保留两个表的全部数据


0