在处理来自多个表的数据时,有许多不同的方法可以JOIN
这些表,每个表都会改变匹配列的处理方式。您也可以从一个表中提取数据,即FROM [table a], [table b]
。
这种方法似乎仍然以某种方式加入表格,如果我不得不猜测我会说这种方法只是FULL OUTER JOIN
的简写,但我确信两者之间存在差异
差异只是FULL OUTER JOIN
后跟ON [table 1 specific column] = [table 2 specific column]
,还是还有其他事情发生?
答案 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