SQL Server中左连接和右连接的区别

我知道在SQL Server中的连接。

例如。 有两个表格Table1,Table2。

有表结构如下。

create table Table1 (id int, Name varchar (10)) create table Table2 (id int, Name varchar (10)) 

表1数据如下:

  Id Name ------------- 1 A 2 B 

表2数据如下:

  Id Name ------------- 1 A 2 B 3 C 

如果我执行下面提到的SQL语句,两个输出将是相同的

 select * from Table1 left join Table2 on Table1.id = Table2.id select * from Table2 right join Table1 on Table1.id = Table2.id 

请解释上面的sql语句中左右连接的区别。

 Select * from Table1 left join Table2 ... 

 Select * from Table2 right join Table1 ... 

确实是完全可以互换的。 不过试试Table2 left join Table1 (或其相同的对, Table1 right join Table2 )来看看有什么不同。 这个查询应该给你更多的行,因为Table2包含一个id不在Table1中的行。

Codeproject有这个图像,它解释了SQL连接的简单基础,取自: http : //www.codeproject.com/KB/database/Visual_SQL_Joins.aspx SQL joins explained

你正在采取的数据表是“左”。
你join的表是'RIGHT'。
左连接:从左表和(仅)从右表中选取所有项目。
右连接:从右表中选取所有项目(仅),从左表中选取项目。
所以:

 Select * from Table1 left join Table2 on Table1.id = Table2.id 

得到:

 Id Name ------------- 1 A 2 B 

但:

 Select * from Table1 right join Table2 on Table1.id = Table2.id 

得到:

 Id Name ------------- 1 A 2 B 3 C 

你是正确的join表与更less的行与更less的行上的行

再次,在表格中用更less的行留下更less的行的连接表
尝试:

  If Table1.Rows.Count > Table2.Rows.Count Then ' Left Join Else ' Right Join End If 
 select fields from tableA --left left join tableB --right on tableA.key = tableB.key 

在这个例子tableA中的from表中from在关系的左边。

 tableA <- tableB [left]------[right] 

所以如果你想从左表( tableA )中取出所有行,即使右表( tableB )中没有匹配,你将使用“left join”。

如果要从右表( tableB )中取出所有行,即使左表( tableA )中没有匹配,也将使用right join

因此,以下查询等同于上面使用的查询。

 select fields from tableB right join tableA on tableB.key = tableA.key 

你似乎在问:“如果我可以使用LEFT OUTER JOIN语法重写一个RIGHT OUTER JOIN那么为什么要有一个RIGHT OUTER JOIN语法呢?” 我认为这个问题的答案是,因为这个语言的devise者不想对用户施加这样的限制(如果他们这样做了,我想他们会受到批评),这会迫使用户改变表的顺序在某些情况下只改变连接types的FROM子句。

你的两个陈述是相同的。

大多数人只使用LEFT JOIN因为它看起来更直观,而且是通用的语法 – 我不认为所有的RDBMS都支持RIGHT JOIN

(INNER)JOIN:返回两个表中具有匹配值的logging。

LEFT(OUTER)JOIN:从左表中返回所有logging,并从右表中返回匹配的logging。

RIGHT(OUTER)JOIN:从右表中返回所有logging,并从左表中返回匹配的logging。

FULL(OUTER)JOIN:在左右表格匹配的情况下,返回所有logging

例如,假设我们有两个表和以下logging:

表A

 id firstname lastname ___________________________ 1 Ram Thapa 2 sam Koirala 3 abc xyz 6 sruthy abc 

表B

 id2 place _____________ 1 Nepal 2 USA 3 Lumbini 5 Kathmandu 

内部联接

注意:给两个表。

内部联接

句法

 SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name; 

将其应用于您的示例表中:

 SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2; 

结果将是:

 firstName lastName Place _____________________________________ Ram Thapa Nepal sam Koirala USA abc xyz Lumbini 

左join

注意:将为TableA中的所有选定行添加TableB中的所有常用选定行。

左连接

 SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name; 

将其应用于您的示例表中

 SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2; 

结果将是:

 firstName lastName Place ______________________________ Ram Thapa Nepal sam Koirala USA abc xyz Lumbini sruthy abc Null 

正确join

注意:将为TableB中的所有选定行,以及TableA中的所有常用选定行。

正确加入

句法:

 SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name; 

将它应用在你的萨摩尔表中:

 SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2; 

结果将会是:

 firstName lastName Place ______________________________ Ram Thapa Nepal sam Koirala USA abc xyz Lumbini Null Null Kathmandu 

完全join

注意:与联合操作相同,它将从两个表中返回所有选定的值。

完全加入

句法:

 SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name; 

将其应用于您的样本[表格:

 SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2; 

结果将是:

 firstName lastName Place ______________________________ Ram Thapa Nepal sam Koirala USA abc xyz Lumbini sruthy abc Null Null Null Kathmandu 

一些事实

INNERjoin顺序并不重要

对于(左,右或全)OUTERjoin,订单事宜

在w3schoolsfind更多

我觉得我们可能需要AND条件在Outer Excluding JOIN的最后一个图的where子句中,以便我们得到A Union B Minus A Interaction B的期望结果。 我觉得查询需要更新到

 SELECT <select_list> FROM Table_A A FULL OUTER JOIN Table_B B ON A.Key = B.Key WHERE A.Key IS NULL AND B.Key IS NULL 

如果我们使用OR ,那么我们将得到A Union B所有结果

select * from Table1 left join table2 on Table1.id = Table2.id

在第一个查询中, 左连接左侧表格table1右侧表格table2进行比较

其中table1的所有属性将被显示,而在table2中,只有那些属性会显示在哪个条件成立。

从Table2中select*在Table1.id = Table2.id中右键连接Table1

在第一个查询中, 右连接右侧table1左侧table2进行比较

其中table1的所有属性将被显示,而在table2中,只有那些属性会显示在哪个条件成立。

这两个查询会得到相同的结果,因为查询中的表声明的顺序是不同的,就像你在第一个左连接查询中分别左右声明table1table2并且第二个右连接中分别右和左声明table1table2查询。

这就是为什么你在这两个查询中得到相同结果的原因。 所以,如果你想要不同的结果,那么分别执行这两个查询,

select * from Table1 left join table2 on Table1.id = Table2.id

从Table1中select*,然后在Table1.id = Table2.id上joinTable2