在右表上使用where子句的Left Join是否与执行内连接相同?
EX:
SELECT *
FROM table t
LEFT JOIN table2 t2 on t.id=t2.id
WHERE t2.name='myName'
VS
SELECT *
FROM table t
INNER JOIN table2 t2 on t.id=t2.id
WHERE t2.name='myName'
答案 0 :(得分:2)
是的,您将始终从这两个查询中获得相同的结果。从LEFT连接获得不同结果的唯一时间是,由于没有匹配的id,返回的t2值都是NULL。你的WHERE语句消除了所有这些情况。
答案 1 :(得分:0)
您应该知道SQL(AFAIK)中只有4种类型的连接。
INNER(左边或右边没有区别,它是相同的连接)
外部 - 左和右
FULL
注意:不计算WHERE子句的变化!
在执行OUTER JOINS以设置WHERE子句以显式接受空值时,您将获得着名的7个Venn图连接:
问题是大多数DSMS允许您省略语法
中的一些单词每个连接应该包含以下整个集合的组合(每行1个):
左或右(默认为左)
OUTER或INNER(默认为外部)
JOIN
所以当你写LEFT JOIN时,你应该至少在头部写完整语法: LEFT OUTER JOIN 当您编写JOIN时,完整语法是: LEFT INNER JOIN
2现在明显不一样了。
内部和外部联接之间的差异是您正在进行联接的列中的空值
OUTER join包含主表中的所有记录(如果是左侧则为第1个表,如果是右侧则为第2个表)。由于辅助表中没有匹配项,因此该列没有值,它们的值将为null,但这些行将显示在结果中。
INNER join仅包含主表成功设置为连接到辅助表的那些值。如果列中存在null,那么该行上的连接将不会被连接,因此会在结果中省略。
快速示例
表格A
1 bla 2
2 bla null
3 bla 3
表B
1 bla 3
2 bla null
3 bla 3
LEFT OUTER JOIN:
1 bla 2 2 bla null
2 bla null null null null
3 bla 3 3 bla 3
JEFT INNER JOIN
1 bla 2 2 bla null
3 bla 3 3 bla 3
您的示例特定说明: 因为我假设您正在通过两个表的主键加入,所以这种情况永远不会发生(空值),因为主键在其定义中具有非空的约束,并且您永远不会看到这种差异。 此外,您需要第二行中的列的值为(非空)