以下连接句是否有效?

时间:2011-09-06 07:33:37

标签: mysql sql join outer-join

此连接在MySQL中是否有效:

FROM a
JOIN b on a.c = b.c and b.c = 1

它确实有效,但是当我使用RIGHT JOIN时, b.c = 1 会被忽略。 那是为什么?

4 个答案:

答案 0 :(得分:2)

RIGHT JOIN中不会忽略它。

(从概念上讲)使用过滤器进行加入,然后将b中任何不匹配的行添加回来。

所以查询

SELECT a.c, b.c
FROM   (select 1 AS c
        UNION ALL
        SELECT 2) a
       RIGHT JOIN (select 1 AS c
                   UNION ALL
                   select 2 AS c) b
         on a.c = b.c
            and b.c = 1  

返回

c           c
----------- -----------
1           1
NULL        2

您可以看到,尽管两个表都有2,但join子句中的附加过滤器意味着这些行不会加入。但是,由于它是right outer加入,因此右侧表格中的2行(b)仍显示在结果中。

编辑:RE:评论中的问题

  

那么如何在不添加过滤后的行的情况下LEFT JOIN?如果   我使用WHERE子句而不是连接会更慢   行必须加入,对吧?

我真的不明白这个问题。

您可以根据是否要保留左输入或右输入中的所有行来选择LEFT vs RIGHT join。对于简单的2表查询,您当然可以使用其中任何一个,只需反转表的顺序。

类似于是否将过滤器置于WHERE子句或JOIN条件的问题。在OUTER JOIN中,这可以更改结果(在我的示例中,移动b.c = 1WHERE子句的数据意味着只返回1行而不是2)

对于INNER JOIN的情况,放置过滤器的位置并不重要,但我发现将过滤器与JOIN中的2个表和所有其他表之间的关系放在一起更为明智。 WHERE

答案 1 :(得分:1)

是。在on子句中有与其他表无关的额外条件

是可以的

答案 2 :(得分:1)

是的,它是有效的。

但是,当您使用正确的联接时,您将有效地获得“右”表中除了那些不满足连接条件的所有值。这就是正确的加入

在这种情况下,使用where子句限制从表b中取出的内容。

来自a 右上角b在a.c = b.c WHERE b.c = 1

答案 3 :(得分:0)

为什么不这样写它以使它更清楚:

FROM a
JOIN b on a.c = b.c
WHERE b.c = 1