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],还是发生了其他事情?
您的问题已得到解答,但从您的评论中我认为您是否完全理解问题仍然不确定。所以,我想我只需要添加另一个答案:-)
让我们从简单的开始
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。