【问题标题】:Difference between left join and right join in SQL Server [duplicate]SQL Server中左连接和右连接之间的区别[重复]
【发布时间】:2011-06-10 13:59:21
【问题描述】:

我知道 SQL Server 中的联接。

例如。有两个表Table1,Table2。

它们的表结构如下。

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

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

Table1数据如下:

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

Table2数据如下:

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

【问题讨论】:

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


    【解决方案1】:

    你的两个陈述是等价的。

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

    【讨论】:

    • “我不认为所有的 RDBMS 都支持 RIGHT JOIN”——当然,并不是所有的 RDBMS 都支持 SQL。但如果您暗示某些 SQL 产品支持LEFT 但不支持RIGHT,请指出哪些。
    • @onedaywhen 例如,SQLite 3 没有实现RIGHTFULL OUTER JOIN sqlite.org/omitted.html
    【解决方案2】:
    Select * from Table1 left join Table2 ...
    

    Select * from Table2 right join Table1 ...
    

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

    【讨论】:

    • 那么,如果我们只用LEFT JOIN 就能达到任何预期的结果,为什么还需要RIGHT JOIN? :P
    • @SilapAliyev 这实际上是一个非常好的问题。谁能回答? :D
    • Select * from Table1 left join Table 2 将返回表 1 的所有记录以及表 2 的重合记录。相反的 Select * from Table1 right join Table 2 将返回表 2 的所有记录和表 1 的重合记录。希望对您有所帮助。
    • 如果你使用超过 2 个表,使用右连接可以是有意义和可读的
    • @MarkusMeskanen 您正在更改一个 7 个单词的简单句子。当你有一个包含多个子句的 356 行句子并且需要更改左右逻辑时,你会想只用一个单词来更改它......
    【解决方案3】:

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

    【讨论】:

    • 有时左右外连接完全可以互换,对吗?
    • @Alex:确实,左右外连接总是可以互换。
    【解决方案4】:
    select fields 
    from tableA --left
    left join tableB --right
    on tableA.key = tableB.key
    

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

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

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

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

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

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

    【讨论】:

      【解决方案5】:

      您从中获取数据的表是“LEFT”。
      您要加入的表是“正确的”。
      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  
      

      【讨论】:

        【解决方案6】:

        我觉得我们可能在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的所有结果

        【讨论】:

          【解决方案7】:

          选择 * 从表 1 left join Table2 on Table1.id = Table2.id

          在第一个查询中,Left joinleft-sidedtable1right-sided 进行比较>table2.

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

          选择 * 从表 2 右连接 Table1 on Table1.id = Table2.id

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

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

          两个查询将给出相同的结果,因为查询中表声明的顺序不同,就像您在 table1table2 中声明strong>left 和 right 分别在 first left join 查询中,同时在 right 和 left 中声明 table1table2 分别在第二次右连接查询中。

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

          选择 * 从表 1 left join Table2 on Table1.id = Table2.id

          选择 * 从表 1 在 Table1.id = Table2.id 上右加入 Table2

          【讨论】:

            【解决方案8】:

            (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
            

            内连接

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

            语法

            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 中任何常见的选定行。

            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 中任何常见的选定行。

            语法:

            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
            

            完全加入

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

            语法:

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

            将它应用到您的示例[le 表中:

            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了解更多信息

            【讨论】:

              【解决方案9】:

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

              同样,根据定义:Right Join 选择表 2 中使用“select”关键字提及的所有列以及表 1 中与“on”关键字之后的条件匹配的列。

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

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

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

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

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

              【讨论】:

                猜你喜欢
                • 2011-05-23
                • 1970-01-01
                • 2023-03-15
                • 1970-01-01
                • 2010-10-01
                • 2014-05-17
                • 2014-01-01
                相关资源
                最近更新 更多