此连接在MySQL中是否有效:
FROM a
JOIN b on a.c = b.c and b.c = 1
它确实有效,但是当我使用RIGHT JOIN时, b.c = 1 会被忽略。 那是为什么?
答案 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 = 1
到WHERE
子句的数据意味着只返回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