为什么LEFT JOINing将第二张表的ID保留为NULL?

时间:2019-02-15 09:48:27

标签: mysql sql

请先参考以下答案:this

因此,在该答案中,它提供了一种基于一个不同的列及其对应的列来获取数据的方法。据我了解,它如何选择通过分别在条件WHERE t1.lastname > t2.lastnameWHERE t1.lastname < t2.lastname上进行升序或降序来对那个不同的列进行排序。

我仍在练习SQL,并且对上面链接中提供的方法有疑问。

  1. 当我尝试选择t2.id时,它全部为空。我无法理解,t2t1基本上不是同一张表吗?如果是这样,它的id变成NULL而不是t1 s id s的可能性如何?
  2. 为什么全部 WHERE t2.id IS NULL 无论如何都要返回NULL,为什么需要检查t2.id
  3. 我认为这是一个部分,我有一个小主意。但是,如果我错了,请纠正我。上述方法行之有效(在这里让我们讨论降序)是因为:首先,我LEFT JOIN将我的t1和{{1 }}基于他们的t2。其次,我还要检查id是否必须比t1.lastname更大(>),而我假设使用的是ASCII或UNICODE值,这肯定会给我返回!只有一个结果; 具有更高价值的产品。好的,现在再问一个问题:它是否与t2.lastname逐一检查t1.lastname,但对所有t2.lastname都检查{{1},如果只是其中一个 {{1 }}导致该条件无效?

我认为我在这里缺少某些东西。有人可以帮我吗?预先谢谢你。

1 个答案:

答案 0 :(得分:1)

LEFT JOIN将显示联接的左侧部分(来自左表的值)并将显示:

    如果连接条件为
  • 连接右侧部分中的右表中的值 完成或
  • 如果不满足加入条件,则为空值

例如:

   INSERT INTO #test (id, firstname, lastname)
   VALUES
   (1, 'A', 'A'),
   (2, 'B', 'B'),
   (3, 'A', 'B'),
   (4, 'B', 'C')

   SELECT t1.*, t2.*
   FROM #test AS t1
   LEFT JOIN #test AS t2
   ON t1.firstname = t2.firstname
   AND t1.lastname < t2.lastname

它将显示

1   A   A   3   A   B
2   B   B   4   B   C
3   A   B   NULL    NULL    NULL
4   B   C   NULL    NULL    NULL

它显示了t1中的所有行,但由于加入条件t1.lastname

如果您现在添加WHERE条件:

SELECT t1.*, t2.*
FROM #test AS t1
LEFT JOIN #test AS t2
ON t1.firstname = t2.firstname
AND t1.lastname < t2.lastname
WHERE t2.id IS NULL;

您将结果限制为不满足联接条件的行。