当您的心理参考是 Excel 的 vlookup 时如何理解连接?

How to understand joins when your mental reference is Excel's vlookup?

当我刚接触 SQL 时,我对 understand how SQL joins work 进行了一些真正深入的思考。在某个时刻,我意识到多年的 prior experience with -or say, exposure to, MS Excel's vlookup,让我的思考和理解出现了错误的方式。虽然网上有很多好的参考资料,但我没有找到。 Venn diagrams 一开始也没有帮助我。我 post 这个问题希望其他人不会像我一样陷入同样的​​心理陷阱。我也会给出答案。当然也非常欢迎其他建议。虽然我花了一些时间来写这篇文章,但如果我不这样做,我就是无法忍受自己 post 这个...

当我从 SQL 开始并加入时,我只是不明白为什么 SQL 的左联接给我的结果比我预期的要多做了一个vlookup。维恩图对我没有帮助,尽管我现在发现它们非常清晰。

经过一周真正激烈的思考后,我突然意识到我之前的经历已经成为我的范例:在 basic formula of vlookuponly one result is given back。在basic expression of a left joinzero or more results are given back.

我会尽力澄清。例如,我在 Excel sheet 中有下面的数据和公式(在 D 列中)。 headers 列在第一行,所以这就是为什么公式声明 A2 等。为了简单起见,我在 B 和 C 附近的 A 列中有数据,实际上最好将它放在某个地方否则,因为您可以将数据集解释为 table,其中每一行都是一条记录。在这个例子中不是这种情况。换句话说:单元格 A3 (2) 与 B3 到 C3(1,蓝色)不是同一记录。对于阅读本文的人,我假设他们理解公式和 'false' 子句,否则从 here.

开始
A    B    C        D                                (result in D) 
1    1    Green    =vlookup(A2,B:C;2;false)        (result=Green)
2    1    Blue     =vlookup(A3,B:C;2;false)        (result=Orange)
3    2    Orange   =vlookup(A4,B:C;2;false)        (result=Yellow)
4    3    Yellow   =vlookup(A5,B:C;2;false)        (result=#n/a)

在 D2 列中,您看到结果只给出了 'Green'。加入会返回 'Green' AND 'Blue'。

查看下面的 SQL 查询(方言是 t-sql)和结果。

select A as AFromTableA
,B as BFromTableBC
,C as CFromTableBC
from tableBC left outer join tableA
on B=A;

结果:

AFromTableA BFromTableBC    CFromTableBC
1           1               Green
1           1               Blue
2           2               Orange
3           3               Yellow

您看到结果中返回了绿色和蓝色。这是因为 join 搜索所有结果。又看到B=4不是return,那是因为它是从TableBC开始的left join。如果它从 TableA 开始,实际上 4 在 table 中,将返回一个空结果。像这样:

AFromTableA BFromTableBC    CFromTableBC
1           1               Green
1           1               Blue
2           2               Orange
3           3               Yellow
4           NULL            NULL

这里有一些脚本可以自己做:

create table tableA (A int)
create table tableBC (B int, C nvarchar(10))

insert into tableA
values (1),(2),(3),(4);

insert into tableBC (B,C)
values (1, 'Green')
,(1, 'Blue')
,(2,'Orange')
,(3, 'Yellow');

所以,希望这个答案能帮助您思考。现在阅读一些关于联接的更多澄清信息:

Difference between INNER and OUTER joins

A Visual Explanation of SQL Joins