谁能告诉我,内部联接在 SQL 中是如何工作的?
Posted
技术标签:
【中文标题】谁能告诉我,内部联接在 SQL 中是如何工作的?【英文标题】:Can anyone tell me, how inner join works in SQL? 【发布时间】:2020-09-06 11:35:32 【问题描述】:我有一个表A和B,都是一列两行如下,
A B
-------
C1 C2
1 1
1 1
1 0
0 0
如果我对此应用内连接并且它返回 8 行作为结果,
Select C1,C2 from A inner join B on A.C1=B.C2;
Result
---------
C1 C2
1 1
1 1
1 1
1 1
1 1
1 1
0 0
0 0
我猜,C1 列的第一行正在检查所有 C2 列的数据。如果匹配,则返回结果,否则不会。其余列采用相同的方法。纠正我,如果我的理解有误,请协助回答以下问题;
我有两个表 A,B 都有两列。如果我们应用内连接会是什么结果,请用功能解释我。
A B
----–-----------
C1 C2 C3 C4
1 1 1 1
1 1 1 0
在A.C1=B.C3上从A内连接B中选择C1,C2,C3,C4;
它返回 4 行,请解释一下如何?
【问题讨论】:
您已将rows
替换为columns
,但基本上您是正确的。对于表 a 中的每一行,连接表 b 中符合连接条件的行。
内部联接将根据您指定的任何 谓词 匹配两个表中的行。在您的第一个示例中,您使用了谓词A.C1 = B.C2
。现在,你想在第二种情况下使用什么谓词?
不行:在您的第二个示例中,B
没有名为 C2
的列。
在 A.C1=B.C3 上从 A 内连接 B 中选择 C1,C2,C3,C4;
请参阅 Martin Smith 的精彩回答:***.com/a/27458534/2527905
【参考方案1】:
这是关于内部连接的常见误解。内连接的概念是说,一个表的列中的值将与另一个表中连接列的每次出现的相同值匹配。
在您的示例中,在表 A 中,C1 列的 1 的第一行将与表 B 的 C2 列的值 1 的所有 2 行匹配,第二个 1 将与所有 2 个 1 匹配,然后第三个 1 将与所有 2 个匹配能 B。那么一个 0 将在表 B 中匹配 2 次。
因此它们变为 - 2(1's) + 2(1's) + 2(1's) + 2(0's) = 8 行。
同样的概念也适用于您的第二个示例。由于您在第二个示例中有 2 列,因此您必须在此处确定连接谓词。
If you decided to join like `A.C1 = B.C3` then 4 rows will occur in result.
If you decided to join like `A.C1 = B.C4` then 2 rows will occur in result.
If you decided to join like `A.C2 = B.C3` then 4 rows will occur in result.
If you decided to join like `A.C2 = B.C4` then 2 rows will occur in result.
【讨论】:
好的,第二个谓词的结果是什么?【参考方案2】:在您的示例中,如果您使用谓词 A.C1 = B.C3
,则结果是:
c1 c2 c3 c4
--- --- --- --
1 1 1 1
1 1 1 1
1 1 1 0
1 1 1 0
请参阅DB Fiddle 的运行示例。
现在,作为一般规则,内连接将根据您指定的任何谓词匹配两个表中的行,不一定是简单的列值。
例如:
A B
-------- --------
C1 C2 # C3 C4 #
1 1 A1 1 1 B1
1 1 A2 1 0 B2
0 1 B3
如果谓词是a.c1 * a.c2 = b.c3 + b.c4
,如查询:
select
a.*,
b.*
from a
join b on a.c1 * a.c2 = b.c3 + b.c4
结果是:
c1 c2 c3 c4 matching predicate
--- --- --- -- --------------------------
1 1 1 0 1 * 1 = 1 + 0 (A1 and B2)
1 1 1 0 1 * 1 = 1 + 0 (A2 and B2)
1 1 0 1 1 * 1 = 0 + 1 (A1 and B3)
1 1 0 1 1 * 1 = 0 + 1 (A2 and B3)
你看到行是如何匹配的吗?
【讨论】:
以上是关于谁能告诉我,内部联接在 SQL 中是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章