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

时间:2011-01-17 16:54:24

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

我知道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语句中左右连接的区别。

10 个答案:

答案 0 :(得分:992)

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

答案 1 :(得分:71)

Select * from Table1 left join Table2 ...

Select * from Table2 right join Table1 ...

确实完全可以互换。但请尝试使用Table2 left join Table1(或其相同的对,Table1 right join Table2)来查看差异。此查询应该为您提供更多行,因为Table2包含一个id为Table1中不存在的行。

答案 2 :(得分:37)

您从中获取数据的表是“左” 您加入的表格是'正确' LEFT JOIN:从左表中获取所有项目和(仅)从右表中匹配项目 RIGHT JOIN:从右表中获取所有项目和(仅)匹配左表中的项目 所以:

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  

你是正确的加入桌子,桌子上的行数越少,行数越多 和
再次,左边连接桌子上的行数较少,行数较多 试试:

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If  

答案 3 :(得分:12)

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

此示例from中的tableA中的表位于关系的左侧。

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

因此,如果您想从左表(tableA)中获取所有行,即使右表(tableB)中没有匹配项,您也将使用“左连接”

如果你想从右表(tableB)获取所有行,即使左表(tableA)中没有匹配项,你也会使用right join

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

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

答案 4 :(得分:10)

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

答案 5 :(得分:10)

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

LEFT(OUTER)JOIN:返回左表中的所有记录,以及右表中匹配的记录。

RIGHT(OUTER)JOIN:返回右表中的所有记录,以及左表中匹配的记录。

FULL(OUTER)JOIN:当左表或右表匹配时返回所有记录

例如,假设我们有两个包含以下记录的表:

  

表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

内部加入

  

注意:它给出了两个表的交集。

Inner Join

<强>语法

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

左加入

  

注意:将给出TableA中的所有选定行,以及TableB中任何常用的选定行。

Left join

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

正确加入

  

注意:将给出TableB中的所有选定行,以及TableA中任何常用的选定行。

Right Join

语法:

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

将它应用到你的samole表中:

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

结果将是bw:

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

完全加入

  

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

Full join

语法:

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

将它应用于你的samp [le table:

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
  

一些事实

对于INNER加入,订单并不重要

对于(LEFT,RIGHT或FULL)OUTER连接,订单重要

w3schools

查找更多内容

答案 6 :(得分:8)

你的两个陈述是等同的。

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

答案 7 :(得分:0)

我觉得我们在AND的上一个数字的where子句中可能需要Outer Excluding JOIN条件,以便我们得到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

的所有结果

答案 8 :(得分:0)

选择* 来自表1   在Table1.id = Table2.id

上左连接Table2

在第一个查询中左连接左侧 table1 右侧表2 即可。

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

选择* 来自表2   右边连接Table1.id = Table2.id

上的Table1

在第一个查询右连接右侧 table1 左侧表2 即可。

其中将显示 table1 的所有属性,而在 table2 中,只显示那些条件为true的属性。

两个查询都会给出相同的结果,因为查询中的表声明的顺序是不同的,就像你在声明 table1 table2 一样在第一次左加入查询中分别使用strong>左右,并在左右声明中声明 table1 table2 分别在第二次右加入查询中。

这就是为什么在两个查询中获得相同结果的原因。因此,如果您需要不同的结果,请分别执行这两个查询,

选择* 来自表1   在Table1.id = Table2.id

上左连接Table2

选择* 来自表1   右连接Table1.id = Table2.id

上的Table2

答案 9 :(得分:0)

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id 根据定义:左连接选择&#34;选择&#34;中提到的所有列。表1中的关键字和表2中的列与&#34; on&#34;之后的标准相匹配关键字。

同样,根据定义:右连接选择&#34;选择&#34;提及的所有列。表2中的关键字和表1中的列与&#34; on&#34;之后的标准相匹配关键字。

参考您的问题,将两个表中的id与要在输出中抛出的所有列进行比较。因此,ids 1和2在两个表中都很常见,因此在结果中您将有四列 id name 列来自 first < / em>和第二个表按顺序排列。

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

上面的表达式,它从表1和列中获取所有记录(行),并从表2和表2中匹配 id&#39;

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

与上面的表达式类似,它从表1和列中获取所有记录(行),并从表2和表2中匹配 id&#39; s 。(记住,这是一个正确的连接,因此将考虑table2中的所有列而不是table1中的所有列。