谁能告诉我,内部联接在 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 中是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SQL 中的多个内部联接转换为 LINQ?

在多列上组合 sql 内部和外部联接

如何使用 Spark sql 在 Databricks 中使用内部联接更新 Databricks Delta 表

如何将此 SQL 内部联接查询转换为 LINQ 语法?

LINQ to SQL 中的内部联接的语法是啥?

DB2 SQL 如何从内部联接表返回 1 行