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

时间:2016-05-03 06:32:05

标签: 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],还是还有其他事情发生?

2 个答案:

答案 0 :(得分:3)

您的问题已经得到解答,但是根据您的评论我收集到您是否完全理解此事仍然不安全。所以,我想我只想补充一点: - )

让我们从简单的

开始吧
FROM a, b

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

FROM a CROSS JOIN b

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

FROM store CROSS JOIN product

无论商店是否真的有产品,您都可以将每个商店与每件商品结合起来;您只需显示所有可能的组合。有两个商店和两个产品,结果可能如下:

store   product
s1      p1
s1      p2
s2      p1
s2      p2

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

在关系数据库中,我们通常会处理表的关系,所以让我们添加连接标准:

FROM a, b
WHERE a.col1 = b.col2

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

FROM a
INNER JOIN b ON a.col1 = b.col2

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

FROM a
JOIN b ON a.col1 = b.col2

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

FROM dept_cost
JOIN dept_gain ON dept_gain.dept_no = dept_cost.dept_no AND dept_gain.year = dept.cost.year

让我们说这些表包含:

year   dept_no   total_cost
2015   d001      20000
2016   d001      25000
2016   d002      10000

year   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
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。

答案 1 :(得分:2)

在第一种情况下,您应用CROSS JOIN(或Cartersian产品) - 如果您不使用WHERE子句链接您的字段(在这种情况下,您有INNER JOIN),第二种情况是你申请FULL OUTER JOIN

<强>差分

使用笛卡尔积,您可以将第一个表的每一行与第二个表的每一行链接

使用FULL OUTER JOIN,您可以将第一个表的行与第二个表的行链接起来,但如果关系不满足,则在两个方面之一中都有NULL。

<强>实施例

假设您有两个这样的表:

CREATE TABLE a (id_a int)
CREATE TABLE b (id_b int)

有这些内容:

INSERT INTO A (1)
INSERT INTO A (2)

INSERT INTO B (2)
INSERT INTO B (3)

在第一种情况下,(笛卡儿产品)你将拥有:

SELECT * FROM A, B

1 2
1 3
2 2
2 3

在第二种情况下,您将拥有:

SELECT * FROM A FULL OUTER JOIN B
ON A.ID_A = B.ID_B

1    NULL
2    2
NULL 3

如果你写:

SELECT * FROM A,B WHERE A.ID_A = B.ID_B 

与此相同:

SELECT * FROM A JOIN B ON A.ID_A = B.ID_B

结果如下:

2 2