我知道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语句中左右连接的区别。
答案 0 :(得分:992)
Codeproject有这个图片,它解释了SQL连接的简单基础知识,取自:http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx
答案 1 :(得分:71)
Select * from Table1 left join Table2 ...
和
Select * from Table2 right join Table1 ...
确实完全可以互换。但请尝试使用Table2 left join Table1
(或其相同的对,Table1 right join Table2
)来查看差异。此查询应该为您提供更多行,因为Table2包含一个id为Table1中不存在的行。
答案 2 :(得分:37)
您从中获取数据的表是“左” 您加入的表格是'正确' 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
答案 3 :(得分:12)
select fields
from tableA --left
left join tableB --right
on tableA.key = tableB.key
此示例from
中的tableA
中的表位于关系的左侧。
tableA <- tableB
[left]------[right]
因此,如果您想从左表(tableA
)中获取所有行,即使右表(tableB
)中没有匹配项,您也将使用“左连接”
如果你想从右表(tableB
)获取所有行,即使左表(tableA
)中没有匹配项,你也会使用right join
因此,以下查询等同于上面的查询。
select fields
from tableB
right join tableA on tableB.key = tableA.key
答案 4 :(得分:10)
您似乎在问,“如果我可以使用RIGHT OUTER JOIN
语法重写LEFT OUTER JOIN
,那么为什么要使用RIGHT OUTER JOIN
语法呢?”我认为这个问题的答案是,因为该语言的设计者不想对用户施加这样的限制(我认为如果他们这样做会受到批评),这将迫使用户改变表的顺序在某些情况下仅在更改连接类型时在FROM
子句中。
答案 5 :(得分:10)
(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
完全加入
注意:它与union操作相同,它将返回两个表中的所有选定值。
语法:
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
将它应用于你的samp [le table:
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连接,订单重要
查找更多内容答案 6 :(得分:8)
你的两个陈述是等同的。
大多数人只使用LEFT JOIN
,因为它看起来更直观,而且它是通用语法 - 我不认为所有RDBMS都支持RIGHT JOIN
。
答案 7 :(得分:0)
我觉得我们在AND
的上一个数字的where
子句中可能需要Outer Excluding JOIN
条件,以便我们得到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
答案 8 :(得分:0)
选择* 来自表1 在Table1.id = Table2.id
上左连接Table2在第一个查询中左连接将左侧表 table1 与右侧表表2 即可。
其中将显示 table1 的所有属性,而在 table2 中,只有那些属性才会显示在哪个条件为true。
选择* 来自表2 右边连接Table1.id = Table2.id
上的Table1在第一个查询右连接将右侧表 table1 与左侧表表2 即可。
其中将显示 table1 的所有属性,而在 table2 中,只显示那些条件为true的属性。
两个查询都会给出相同的结果,因为查询中的表声明的顺序是不同的,就像你在声明 table1 和 table2 一样在第一次左加入查询中分别使用strong>左右,并在左右声明中声明 table1 和 table2 分别在第二次右加入查询中。
这就是为什么在两个查询中获得相同结果的原因。因此,如果您需要不同的结果,请分别执行这两个查询,
选择* 来自表1 在Table1.id = Table2.id
上左连接Table2选择* 来自表1 右连接Table1.id = Table2.id
上的Table2答案 9 :(得分:0)
Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id
根据定义:左连接选择&#34;选择&#34;中提到的所有列。表1中的关键字和表2中的列与&#34; on&#34;之后的标准相匹配关键字。
同样,根据定义:右连接选择&#34;选择&#34;提及的所有列。表2中的关键字和表1中的列与&#34; on&#34;之后的标准相匹配关键字。
参考您的问题,将两个表中的id与要在输出中抛出的所有列进行比较。因此,ids 1和2在两个表中都很常见,因此在结果中您将有四列 id 和 name 列来自 first < / em>和第二个表按顺序排列。
*select *
from Table1
left join Table2 on Table1.id = Table2.id
上面的表达式,它从表1和列中获取所有记录(行),并从表2和表2中匹配 id&#39; 。
select *
from Table2
right join Table1 on Table1.id = Table2.id**
与上面的表达式类似,它从表1和列中获取所有记录(行),并从表2和表2中匹配 id&#39; s 。(记住,这是一个正确的连接,因此将考虑table2中的所有列而不是table1中的所有列。