我已经上网大约一个小时了,但我似乎无法从其他地方得到直接答案。我有几个关于连接的问题希望您能解答。我会尽量简单。
假设我有两个表:
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
问题:
什么决定了左侧的主表将列出所有条目?这是我在“LEFT JOIN”语句两侧写入表格的顺序吗?还是根据ON条件下表的顺序?
ON 条件的顺序重要吗?或者它只是用于将特定列上的表格链接在一起以进行比较?
当我有两个以上的 table 时会发生什么?假设有一个表 C,我想将其 LEFT JOIN 到执行 A LEFT JOIN B 的结果:
SELECT * FROM A LEFT JOIN B ON A.A = B.B LEFT JOIN C ON ....
那里有什么?是C.C=A.A吗?或者是 C.C = B.B?
我想问题是,任何额外的 LEFT JOIN 具体要连接到哪个表?
连接的左侧是什么?
最佳答案
您的两个查询不会给出相同的结果。
SELECT * FROM A LEFT JOIN B ON A.A = B.B
会给你
1 null
2 null
3 3
4 4
同时
SELECT * FROM B LEFT JOIN A ON B.B = A.A
会给你
3 3
4 4
5 null
6 null
LEFT JOIN 之前的表将列出其所有结果,无论 LEFT JOIN 语句之后出现的表上有什么内容。您将 ON 条件写为“on”的顺序不会影响结果中显示的内容。
ON 条件的顺序对返回的内容没有影响
您可以执行以下操作:
SELECT * FROM A LEFT JOIN B ON B.ID = A.ID LEFT JOIN C ON C.ID = A.ID
在上面的语句中,将显示表A中的所有值;以及表 B 或表 C 中也存在于表 A 中的任何值。
如果你改变了
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
关于SQL 连接及其在查询中列出的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19698284/