2

我已经上网大约一个小时了,但我似乎无法从其他地方得到直接的答案。我有几个关于连接的问题,希望你能回答。我会尽量简单。

假设我有两张桌子:

A    B
-    -
1    3
2    4
3    5
4    6

值 (1, 2) 是 A 独有的,(3, 4) 是常见的, (5, 6) 是 B 独有的。

现在我了解了内部和外部(左和右)连接的目的。我的问题与编写它们的顺序有关。

例如,以下两个查询会产生相同的结果吗?

SELECT * FROM A LEFT JOIN B ON A.A = B.B

SELECT * FROM B LEFT JOIN A ON B.B = A.A

问题:

  1. 是什么决定了左侧将列出所有条目的主表?是我在“LEFT JOIN”语句两侧写表的顺序吗?还是基于 ON 条件下的表格顺序?

  2. ON 条件的顺序是否重要?还是仅用于将特定列上的表格链接在一起以进行比较?

  3. 当我有两个以上的表时会发生什么?假设有一个表 C,我想 LEFT JOIN 到执行 A LEFT JOIN B 的结果:

    SELECT * FROM A 
    LEFT JOIN B ON A.A = B.B
    LEFT JOIN C ON ....
    

那里有什么?是CC = AA吗?还是CC = BB?

我想问题是,任何额外的 LEFT JOIN 都具体加入了哪个表?

连接的左侧是什么?

4

1 回答 1

3

您的两个查询不会给您相同的结果。

SELECT * FROM A LEFT JOIN B ON A.A = B.B

会给你

1个空

2 空

3 3

4 4

尽管

SELECT * FROM B LEFT JOIN A ON B.B = A.A

会给你

3 3

4 4

5 空

6 空

  1. LEFT JOIN 之前的表是列出所有结果的表,无论 LEFT JOIN 语句之后出现的表上有什么。您将 ON 条件写入“on”的顺序对结果中显示的内容没有影响。

  2. ON 条件的顺序对返回的内容没有影响

  3. 您将执行以下操作:

SELECT *
FROM A 
   LEFT JOIN B ON B.ID = A.ID
       LEFT JOIN C ON C.ID = A.ID

在上述语句中,将显示表 A 中的所有值;以及表 A 中也存在的表 B 或 C 中的任何值。

如果你改变了

LEFT JOIN C ON C.ID = A.ID

LEFT JOIN C ON C.ID = B.ID

那么只会显示所有三个表中都存在的值。您实际上是在说,“给我表 A 中存在的所有信息,加上表 B 中与相同值对应的任何数据,以及与表 C 中相同值对应的任何数据”。如果表 B 中不存在数据,则表 C 中的任何数据也不会出现在结果中。

LEFT JOIN C ON C.ID = A.ID 

可以可视化为

在此处输入图像描述

另一方面,

LEFT JOIN C ON C.ID = B.ID

可以看作

在此处输入图像描述

现在我在草图中写下数字而不是字母,但在我的毕加索上面 1 = A, 2 = B, 3 = C

于 2013-10-31T05:00:02.753 回答