SQL Server中左连接和右连接的区别
我知道在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语句中左右连接的区别。
Select * from Table1 left join Table2 ...
和
Select * from Table2 right join Table1 ...
确实是完全可以互换的。 不过试试Table2 left join Table1
(或其相同的对, Table1 right join Table2
)来看看有什么不同。 这个查询应该给你更多的行,因为Table2包含一个id不在Table1中的行。
Codeproject有这个图像,它解释了SQL连接的简单基础,取自: http : //www.codeproject.com/KB/database/Visual_SQL_Joins.aspx
你正在采取的数据表是“左”。
你join的表是'RIGHT'。
左连接:从左表和(仅)从右表中选取所有项目。
右连接:从右表中选取所有项目(仅),从左表中选取项目。
所以:
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
你是正确的join表与更less的行与更less的行上的行
和
再次,在表格中用更less的行留下更less的行的连接表
尝试:
If Table1.Rows.Count > Table2.Rows.Count Then ' Left Join Else ' Right Join End If
select fields from tableA --left left join tableB --right on tableA.key = tableB.key
在这个例子tableA
中的from
表中from
在关系的左边。
tableA <- tableB [left]------[right]
所以如果你想从左表( tableA
)中取出所有行,即使右表( tableB
)中没有匹配,你将使用“left join”。
如果要从右表( tableB
)中取出所有行,即使左表( tableA
)中没有匹配,也将使用right join
。
因此,以下查询等同于上面使用的查询。
select fields from tableB right join tableA on tableB.key = tableA.key
你似乎在问:“如果我可以使用LEFT OUTER JOIN
语法重写一个RIGHT OUTER JOIN
那么为什么要有一个RIGHT OUTER JOIN
语法呢?” 我认为这个问题的答案是,因为这个语言的devise者不想对用户施加这样的限制(如果他们这样做了,我想他们会受到批评),这会迫使用户改变表的顺序在某些情况下只改变连接types的FROM
子句。
你的两个陈述是相同的。
大多数人只使用LEFT JOIN
因为它看起来更直观,而且是通用的语法 – 我不认为所有的RDBMS都支持RIGHT JOIN
。
(INNER)JOIN:返回两个表中具有匹配值的logging。
LEFT(OUTER)JOIN:从左表中返回所有logging,并从右表中返回匹配的logging。
RIGHT(OUTER)JOIN:从右表中返回所有logging,并从左表中返回匹配的logging。
FULL(OUTER)JOIN:在左右表格匹配的情况下,返回所有logging
例如,假设我们有两个表和以下logging:
表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
左join
注意:将为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
正确join
注意:将为TableB中的所有选定行,以及TableA中的所有常用选定行。
句法:
SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;
将它应用在你的萨摩尔表中:
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
完全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
一些事实
INNERjoin顺序并不重要
对于(左,右或全)OUTERjoin,订单事宜
在w3schoolsfind更多
我觉得我们可能需要AND
条件在Outer Excluding JOIN
的最后一个图的where
子句中,以便我们得到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
所有结果
select * from Table1 left join table2 on Table1.id = Table2.id
在第一个查询中, 左连接将左侧表格table1与右侧表格table2进行比较 。
其中table1的所有属性将被显示,而在table2中,只有那些属性会显示在哪个条件成立。
从Table2中select*在Table1.id = Table2.id中右键连接Table1
在第一个查询中, 右连接将右侧表table1与左侧表table2进行比较 。
其中table1的所有属性将被显示,而在table2中,只有那些属性会显示在哪个条件成立。
这两个查询会得到相同的结果,因为查询中的表声明的顺序是不同的,就像你在第一个左连接查询中分别左右声明table1和table2 , 并且在第二个右连接中分别右和左声明table1和table2查询。
这就是为什么你在这两个查询中得到相同结果的原因。 所以,如果你想要不同的结果,那么分别执行这两个查询,
select * from Table1 left join table2 on Table1.id = Table2.id
从Table1中select*,然后在Table1.id = Table2.id上joinTable2