首页 文章

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

提问于
浏览
204

我知道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 回答

  • 37
    Select * from Table1 left join Table2 ...
    

    Select * from Table2 right join Table1 ...
    

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

  • 11

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

  • 10

    您从中获取数据的表是'LEFT' .
    您要加入的表是'RIGHT' .
    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
    

    你是正确的连接表,更少的行在 table 上

    再次,左表连接表,表中行数较少,行数较多
    尝试:

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

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

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

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

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

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

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

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

  • 977

    你的两个陈述是等价的 .

    大多数人只使用 LEFT JOIN ,因为它看起来更直观,并且认为所有RDBMS都支持 RIGHT JOIN .

  • 0

    (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

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

    Inner Join

    Syntax

    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
    

    Left Join

    注意:将给出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
    

    Right Join

    注意:将给出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
    

    Full Join

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

    Full 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
    

    一些事实

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

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

    w3schools查找更多信息

  • 0

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

  • 6

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

    在第一个查询 Left join 比较 left-sidedtable1right-sidedtable2 .

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

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

    在第一个查询 Right join 比较 right-sidedtable1left-sidedtable2 .

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

    Both queries will give the same result because the order of table declaration in query are different 就像在 first left join 查询中分别在 left and right 中声明 table1table2 ,并且在 second right join 查询中分别在 right and left 中声明 table1table2 .

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

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

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

  • 0

    Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id 根据定义:Left Join选择表1中使用"select"关键字提及的所有列,以及表2中与"on"关键字后面的条件匹配的列 .

    类似地,根据定义:右连接选择表2中使用“select”关键字提及的所有列,以及表1中与“on”关键字后面的条件匹配的列 .

    参考您的问题,将两个表中的id与需要在输出中抛出的所有列进行比较 . 因此,ids 1和2在两个表中都很常见,因此在结果中,您将有四列具有来自第一和第二表的id和name列的列 .

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

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

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

    与上面的表达式类似,它从表1和列中获取所有记录(行),表2中包含表1和表2中的匹配id . (记住,这是一个右连接,因此table2中的所有列都没有从table1将被考虑) .

相关问题