“FROM a, b”和“FROM a FULL OUTER JOIN b”有什么区别?

Spa*_*ich 4 sql join full-outer-join

处理来自多个表的数据时,您可以通过多种不同的方式处理JOIN这些表,每种方式都会改变处理匹配列的方式。您也可以从多个表中提取数据,即FROM [table a], [table b].

这种方法似乎仍然以某种方式连接表格,如果我不得不猜测,我会说这种方法只是 的简写FULL OUTER JOIN,但我确定两者之间存在差异。

区别只是跟FULL OUTER JOIN在 后面ON [table 1 specific column] = [table 2 specific column],还是发生了其他事情?

Tho*_*ner 7

您的问题已得到解答,但从您的评论中我认为您是否完全理解问题仍然不确定。所以,我想我只需要添加另一个答案:-)

让我们从简单的开始

FROM a, b
Run Code Online (Sandbox Code Playgroud)

这是一种过时的连接语法,在标准 SQL-1992 中被显式连接取代。有了上面的内容,您必须将连接条件(如果有)放在 WHERE 子句中。如果没有 WHERE 子句中的连接条件,这是一个交叉连接,您现在可以明确地将其写为

FROM a CROSS JOIN b
Run Code Online (Sandbox Code Playgroud)

这告诉读者您有意想要 a 和 b 的所有组合(并且不仅忘记了连接条件或错误地删除了它)。一个例子是

FROM store CROSS JOIN product
Run Code Online (Sandbox Code Playgroud)

在这里你把每家商店和每一种产品结合起来,不管商店是否真的有产品;您只需显示所有可能的组合。有两个商店和两个产品,结果可能如下所示:

商店产品
s1 p1
s1 p2
s2 p1
s2 p2

CROSS JOIN 是很少需要的。在上述情况下,我们可能想知道所有商店产品/组合并为每一行选择“是”或“否”,因此我们可以看到商店有哪些产品,哪些没有。

然而,在关系数据库中,我们通常处理表的关系,所以让我们添加连接条件:

FROM a, b
WHERE a.col1 = b.col2
Run Code Online (Sandbox Code Playgroud)

这是一个内部连接,我们只查找记录匹配。这现在写成

FROM a
INNER JOIN b ON a.col1 = b.col2
Run Code Online (Sandbox Code Playgroud)

或(省略可选关键字INNER,因为默认情况下连接是内部连接):

FROM a
JOIN b ON a.col1 = b.col2
Run Code Online (Sandbox Code Playgroud)

这是一个例子。我们有两个表格,其中包含每个部门和年度的费用和收入。

FROM dept_cost
JOIN dept_gain ON dept_gain.dept_no = dept_cost.dept_no AND dept_gain.year = dept.cost.year
Run Code Online (Sandbox Code Playgroud)

假设表包含:

年部门_无总成本
2015 d001 20000
2016 d001 25000
2016 d002 10000

年份 dept_no total_gain
2015 d001 40000
2015 d002 30000
2016 d001 50000

那么结果将是:

year dept_no total_cost total_gain
2015 d001 20000 40000
2016 d001 25000 50000

因为在两个表中都只找到了 2015/d001 和 d001/2016 。

如果您还想查看其他数据,则必须进行外部联接。您可以将 dept_gain 外部连接到 dept_cost,以便查看所有成本 - 以及它们的收益(如果有的话)。或者,反之亦然,您将 dept_cost 外部连接到 dept_gain,以便查看所有收益 - 以及它们的成本(如果有的话)。或者你完全外连接,以便查看所有数据

FROM dept_cost
FULL OUTER JOIN dept_gain ON dept_gain.dept_no = dept_cost.dept_no 
                          AND dept_gain.year = dept.cost.year
Run Code Online (Sandbox Code Playgroud)
year dept_no total_cost total_gain
2015 d001 20000 40000
2015 d002 30000
2016 d001 25000 50000
2016 d002 10000        

CROSS JOIN 和FULL OUTER JOIN 都很少需要。因此,如果您还不了解它们,请不要担心。您通常只需要 INNER JOIN,有时需要 LEFT OUTER JOIN。