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

Pan*_*wal 218 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))
Run Code Online (Sandbox Code Playgroud)

表1数据如下:

    Id     Name     
    -------------
    1      A        
    2      B    
Run Code Online (Sandbox Code Playgroud)

表2数据如下:

    Id     Name     
    -------------
    1      A        
    2      B 
    3      C
Run Code Online (Sandbox Code Playgroud)

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

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

select *
from Table2
  right join Table1 on Table1.id = Table2.id
Run Code Online (Sandbox Code Playgroud)

请解释上述SQL语句中左右连接的区别.

Daa*_*mer 1005

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

  • 那里没有太多"细节".Credit实际上应该转到codeproject页面而不是我.但我当然不介意注意:-) (64认同)
  • @Daan Timmer不,也一定要归功于你!您重新包装和转售以满足特定和特定的需求.零售商做同样的事情并获得数十亿美元 (6认同)

Pét*_*rök 72

Select * from Table1 left join Table2 ...
Run Code Online (Sandbox Code Playgroud)

Select * from Table2 right join Table1 ...
Run Code Online (Sandbox Code Playgroud)

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

  • `从表1中选择*左连接表2`将返回表1的所有记录加上表2的重合记录.相反的`从表1中选择*右连接表2`将返回表2中的所有记录和表1的重合记录希望它有所帮助. (21认同)
  • 那么为什么我们需要`RIGHT JOIN`如果我们只用'LEFT JOIN'就可以达到任何想要的结果?:P (17认同)
  • 如果你使用超过2个表,使用右连接可能是有意义和可读的 (3认同)
  • @MarkusMeskanen 您正在更改 7 个单词的简单句子。当你有一个包含多个子句的 356 行句子并且需要改变 Left Right 的逻辑时,你会想知道只用一个词来改变它...... (2认同)

小智 37

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

Select * from Table1 left join Table2 on Table1.id = Table2.id  
Run Code Online (Sandbox Code Playgroud)

得到:

Id     Name       
-------------  
1      A          
2      B      
Run Code Online (Sandbox Code Playgroud)

但:

Select * from Table1 right join Table2 on Table1.id = Table2.id
Run Code Online (Sandbox Code Playgroud)

得到:

Id     Name       
-------------  
1      A          
2      B   
3      C  
Run Code Online (Sandbox Code Playgroud)

你是正确的连接表,桌面上的行数越少,行数越多
,
再次连接表,表中行数越少,行数越多,
尝试:

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If  
Run Code Online (Sandbox Code Playgroud)


小智 19

(内部)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
Run Code Online (Sandbox Code Playgroud)

表B.

id2   place
_____________
1      Nepal
2      USA
3      Lumbini
5      Kathmandu
Run Code Online (Sandbox Code Playgroud)

内部联接

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

内部联接

句法

SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
Run Code Online (Sandbox Code Playgroud)

将其应用于您的样本表:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;
Run Code Online (Sandbox Code Playgroud)

结果将是:

firstName       lastName       Place
_____________________________________
  Ram         Thapa             Nepal
  sam         Koirala            USA
  abc         xyz              Lumbini
Run Code Online (Sandbox Code Playgroud)

左加入

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

左连接

SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;
Run Code Online (Sandbox Code Playgroud)

将其应用于您的样本表中

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;
Run Code Online (Sandbox Code Playgroud)

结果将是:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
Run Code Online (Sandbox Code Playgroud)

正确加入

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

正确加入

句法:

SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;
Run Code Online (Sandbox Code Playgroud)

将它应用到你的samole表中:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;
Run Code Online (Sandbox Code Playgroud)

结果将是bw:

firstName   lastName     Place
______________________________
Ram         Thapa         Nepal
sam         Koirala       USA
abc         xyz           Lumbini
Null        Null          Kathmandu
Run Code Online (Sandbox Code Playgroud)

完全加入

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

完全加入

句法:

SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
Run Code Online (Sandbox Code Playgroud)

将它应用到你的样本表中:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;
Run Code Online (Sandbox Code Playgroud)

结果将是:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
 Null         Null      Kathmandu
Run Code Online (Sandbox Code Playgroud)

一些事实

对于INNER加入,订单无关紧要

对于(LEFT,RIGHT或FULL)OUTER连接,顺序很重要

w3schools找到更多


小智 12

select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key
Run Code Online (Sandbox Code Playgroud)

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

tableA <- tableB
[left]------[right]
Run Code Online (Sandbox Code Playgroud)

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

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

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

select fields
from tableB 
right join tableA on tableB.key = tableA.key
Run Code Online (Sandbox Code Playgroud)


one*_*hen 10

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

  • @Alex:确实左右外连接总是*可互换. (4认同)

JNK*_*JNK 8

你的两个陈述是等价的.

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

  • @onedaywhen例如,SQLite 3没有实现`RIGHT`和`FULL OUTER JOIN`:http://www.sqlite.org/omitted.html (9认同)