Sql “与”的区别是什么;从a,b“开始;及;从一个完整的外部连接b";?

Sql “与”的区别是什么;从a,b“开始;及;从一个完整的外部连接b";?,sql,join,full-outer-join,Sql,Join,Full Outer Join,使用多个表中的数据时,有许多不同的方法可以连接这些表,每种方法都会改变处理匹配列的方式。您也可以从一个表中的多个表中提取数据,即从[表a]、[表b]中提取数据 这个方法似乎仍然以某种方式连接表,如果我不得不猜测的话,我会说这个方法只是完全外部连接的简写,但我确信两者之间有区别 区别仅仅在于[table 1 specific column]=[table 2 specific column]上的紧随其后的是,还是发生了其他事情?在第一种情况下,如果不使用WHERE子句链接字段,则应用了交叉连接(或

使用多个表中的数据时,有许多不同的方法可以
连接这些表,每种方法都会改变处理匹配列的方式。您也可以从一个表中的多个表中提取数据,即从[表a]、[表b]
中提取数据

这个方法似乎仍然以某种方式连接表,如果我不得不猜测的话,我会说这个方法只是
完全外部连接的简写,但我确信两者之间有区别


区别仅仅在于[table 1 specific column]=[table 2 specific column]
上的
紧随其后的是
,还是发生了其他事情?

在第一种情况下,如果不使用WHERE子句链接字段,则应用了
交叉连接(或Cartersian产品)
(在这种情况下,您有一个
内部联接
),在第二种情况下,您应用一个
完全外部联接

差异

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

使用
FULL OUTER JOIN
可以将第一个表的行与第二个表的行链接起来,但如果关系不满足,则在两个表的其中一侧有一个空值

示例

假设您有两张这样的表:

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

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

你的问题已经得到了回答,但从你的评论来看,我想你仍然不确定你是否完全理解了这件事。因此,我想我应该补充另一个答案:-)

让我们从简单的问题开始

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 这是一个内部连接,我们只查找记录匹配。现在写为

FROM a
INNER JOIN b ON a.col1 = b.col2
或者(省略可选关键字
internal
,因为连接默认为内部连接):

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

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 年度部门无总成本总收益 2015年d001 20000 40000 2015 d002 30000 2016年d001 25000 50000 2016 d002 10000
交叉连接和完全外部连接很少需要。所以,如果你还不理解他们,不要担心。您通常只需要内部连接,有时还需要左外部连接。

这个问题已经被问过了,但是,这个问题被问到的附加变量混淆了可能的答案,而答案本身虽然准确,但没有足够的细节来解决这个混淆。由于我无法就这个问题发表评论,因此我提出了一个新的问题。如果答案显示这个问题有额外的变量,这些变量将从这个问题中删除,以避免混淆未来的读者。原始问题:这会使第一个方法成为
内部连接的简写吗?@SpaceOstrich:不会。第一个版本是交叉连接,而不是内部连接join@SpaceOstrich:为了获得完整的信息,我添加了关于内部连接的案例(问题中没有涉及),因此如果我理解正确,在
交叉连接中
这两个表仅通过“索引号”匹配。而不是有一个共享列,数据被合并?我认为一个交叉加入一个内部连接,没有连接条件。(所有行组合在一起,没有关系,没有“索引号”。)然后点击。写得很好,如果我有问题,我肯定会在账单上保留。 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
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