SQL Server 2012 - 与Where vs Inner Join的左连接

时间:2015-08-24 19:54:15

标签: sql sql-server sql-server-2012 left-join

在右表上使用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'

2 个答案:

答案 0 :(得分:2)

是的,您将始终从这两个查询中获得相同的结果。从LEFT连接获得不同结果的唯一时间是,由于没有匹配的id,返回的t2值都是NULL。你的WHERE语句消除了所有这些情况。

答案 1 :(得分:0)

您应该知道SQL(AFAIK)中只有4种类型的连接。

  • INNER(左边或右边没有区别,它是相同的连接)

  • 外部 - 左和右

  • FULL

注意:不计算WHERE子句的变化!

在执行OUTER JOINS以设置WHERE子句以显式接受空值时,您将获得着名的7个Venn图连接:

7 joins Venn diagrams

问题是大多数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

您的示例特定说明: 因为我假设您正在通过两个表的主键加入,所以这种情况永远不会发生(空值),因为主键在其定义中具有非空的约束,并且您永远不会看到这种差异。 此外,您需要第二行中的列的值为(非空)