SQL Server中左连接和右连接的区别
我知道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
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标准匹配的列