SQL 连接及其在查询中列出的顺序

标签 sql sql-server t-sql ssms

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

假设我有两个表:

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. 当我有两个以上的 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

  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中的所有值;以及表 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 

可以可视化为

enter image description here

另一方面,

LEFT JOIN C ON C.ID = B.ID

可以看作

enter image description here

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

关于SQL 连接及其在查询中列出的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19698284/

相关文章:

SQLite "INDEXED BY"在 SELECT 中不工作

sql - 如何返回当天写的最新行?

c# - 如何在 SQL 查询结果中动态添加行

mysql - 在范围表上计算成本

sql - Oracle regexp_substr - 从不同格式的字符串中提取子字符串

mysql - 如何创建对年份进行分组的查询

sql - 如何递归查找两个表之间的相交地理

sql-server - SQL Server 2005 自动更新日期时间列 - LastUpdated

sql-server-2005 - SQL Server 查询特定日期之间的行

sql - 在 SQL Server 中,按日期排序不按降序显示所有日期