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

SQL Server中左连接和右连接的区别,sql,sql-server,join,left-join,right-join,Sql,Sql Server,Join,Left Join,Right Join,我知道SQL Server中的连接 比如说。有两张表,表一,表二 它们的表结构如下所示 create table Table1 (id int, Name varchar (10)) create table Table2 (id int, Name varchar (10)) 表1数据如下: Id Name ------------- 1 A 2 B Id Name

我知道SQL Server中的连接

比如说。有两张表,表一,表二

它们的表结构如下所示

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

create table Table2 (id int, Name varchar (10))
表1数据如下:

    Id     Name     
    -------------
    1      A        
    2      B    
    Id     Name     
    -------------
    1      A        
    2      B 
    3      C
表2数据如下:

    Id     Name     
    -------------
    1      A        
    2      B    
    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语句中解释左join和右join之间的区别。

您的两个语句是等效的


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

Select * from Table1 left join Table2 ...

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

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

select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key
本例中
表A
中的
from
中的表位于关系的左侧

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

从中获取数据的表为“左”。
您要加入的表是“正确的”。
左连接:从左表中获取所有项目,并(仅)从右表中获取匹配的项目。
右连接:从右表中获取所有项目,并(仅)从左表中获取匹配的项目。
因此:

给出:

Id     Name       
-------------  
1      A          
2      B      
Id     Name       
-------------  
1      A          
2      B   
3      C  
但是:

Select * from Table1 right join Table2 on Table1.id = Table2.id
给出:

Id     Name       
-------------  
1      A          
2      B      
Id     Name       
-------------  
1      A          
2      B   
3      C  
您正确地将表中的行数较少的表与行数较多的表连接起来

同样,左连接表的行数较少,左连接表的行数较多
尝试:


我觉得我们可能需要
外部排除连接的
最后一个数字的
where
子句中的
条件,以便我们得到
联合B减去交互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
选择
从表A
完全外部联接表
按A键=按B键
其中A.Key为NULL,B.Key为NULL
如果我们使用
,那么我们将获得
联合B
选择的所有结果* 来自表1 在Table1.id=Table2.id上左键连接Table2

在第一个查询中,左连接左侧表1右侧表2进行比较

其中,将显示表1的所有属性,而在表2中,只有那些属性将显示在哪个条件下为真

选择* 来自表2 右键连接Table1.id=Table2.id上的Table1

在第一个查询中,右连接右侧表1左侧表2进行比较

其中,将显示表1的所有属性,而在表2中,只有那些属性将显示在哪个条件下为真

两个查询将给出相同的结果,因为查询中表声明的顺序不同,就像您在第一个左联接查询中分别在左侧和右侧中声明表1表2,并在右键联接查询中分别在右键联接查询中声明表1表2

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

选择* 来自表1 在Table1.id=Table2.id上左键连接Table2

选择* 来自表1 右键联接Table1.id=Table2.id上的Table2(内部)联接:返回两个表中具有匹配值的记录

左(外部)联接:返回左表中的所有记录,以及右表中匹配的记录

右(外部)联接:返回右表中的所有记录,以及左表中匹配的记录

完全(外部)联接:当左表或右表中存在匹配项时,返回所有记录

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

表A

表B

内部联接

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

语法

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
firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
左连接

注意:将给出表A中的所有选定行,以及表B中的任何常见选定行

在示例表中应用它

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
firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
右连接

注意:将给出表B中的所有选定行,以及表A中的所有常用选定行

语法:

SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;
SELECT column_name(s) FROM table1 FULL OUTER 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;
结果如下:

firstName   lastName     Place
______________________________
Ram         Thapa         Nepal
sam         Koirala       USA
abc         xyz           Lumbini
Null        Null          Kathmandu
完全连接

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

语法:

SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
将其应用于samp[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
一些事实

对于内部连接,顺序并不重要

对于(左、右或全)外部联接,顺序很重要


有关详细信息,请访问t1.id=t2.id上的表1 t1左连接表2 t2中的选择*


根据定义:Left Join选择表1中带有“select”关键字的所有列,以及表2中与afte标准匹配的列