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