我知道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语句中左右连接的区别 .
10 回答
和
确实是完全可以互换的 . 但请尝试
Table2 left join Table1
(或其相同的一对,Table1 right join Table2
)以查看差异 . 此查询应该为您提供更多行,因为Table2包含一个id为Table1中不存在的行 .Codeproject有这个图片,它解释了SQL连接的简单基础知识,取自:http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx
您从中获取数据的表是'LEFT' .
您要加入的表是'RIGHT' .
LEFT JOIN:从左表中获取所有项目和(仅)从右表中匹配项目 .
RIGHT JOIN:从右表中获取所有项目并且(仅)从左表中匹配项目 .
所以:
得到:
但:
得到:
你是正确的连接表,更少的行在 table 上
和
再次,左表连接表,表中行数较少,行数较多
尝试:
此示例
tableA
中from
中的表位于关系的左侧 .因此,如果您想从左表(
tableA
)中获取所有行,即使右表(tableB
)中没有匹配项,您也将使用"left join" .如果你想从右表(
tableB
)获取所有行,即使左表(tableA
)中没有匹配项,也将使用right join
.因此,以下查询等同于上面使用的查询 .
你似乎在问,“如果我可以使用
LEFT OUTER JOIN
语法重写RIGHT OUTER JOIN
那么为什么要使用RIGHT OUTER JOIN
语法呢?”我认为这个问题的答案是,因为该语言的设计者不想对用户施加这样的限制(我认为如果他们这样做会受到批评),这将迫使用户改变表的顺序在某些情况下,仅在更改连接类型时,在FROM
子句中 .你的两个陈述是等价的 .
大多数人只使用
LEFT JOIN
,因为它看起来更直观,并且认为所有RDBMS都支持RIGHT JOIN
.(INNER) JOIN: 返回两个表中具有匹配值的记录 .
LEFT (OUTER) JOIN: 返回左表中的所有记录,以及右表中的匹配记录 .
RIGHT (OUTER) JOIN: 返回右表中的所有记录,以及左表中匹配的记录 .
FULL (OUTER) JOIN: 当左表或右表中存在匹配时,返回所有记录
例如,假设我们有两个包含以下记录的表:
Inner Join
Syntax
将其应用于您的样本表:
结果将是:
Left Join
将其应用于您的样本表中
结果将是:
Right Join
句法:
将它应用到你的samole表中:
结果将是bw:
Full Join
句法:
将它应用在你的样本表中:
结果将是:
对于INNER加入,订单无关紧要
对于(LEFT,RIGHT或FULL)OUTER连接,顺序很重要
在w3schools查找更多信息
我觉得我们可能在
Outer Excluding JOIN
的最后一个数字的where
子句中需要AND
条件,以便我们得到A Union B Minus A Interaction B
的预期结果 . 我觉得查询需要更新到如果我们使用
OR
,那么我们将获得A Union B
的所有结果select * from Table1 left join Table2 on Table1.id = Table2.id
在第一个查询 Left join 比较 left-sided 表 table1 到 right-sided 表 table2 .
其中将显示 table1 的所有属性,而在 table2 中,只有那些属性将显示在哪个条件为true .
select * from Table2 right join Table1 on Table1.id = Table2.id
在第一个查询 Right join 比较 right-sided 表 table1 到 left-sided 表 table2 .
其中将显示 table1 的所有属性,而在 table2 中,只有那些属性将显示在哪个条件为true .
Both queries will give the same result because the order of table declaration in query are different 就像在 first left join 查询中分别在 left and right 中声明 table1 和 table2 ,并且在 second right join 查询中分别在 right and left 中声明 table1 和 table2 .
这就是为什么在两个查询中获得相同结果的原因 . 所以如果你想要不同的结果,那么分别执行这两个查询,
select * from Table1 left join Table2 on Table1.id = Table2.id
select * from Table1 right join Table2 on Table1.id = Table2.id
Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id
根据定义:Left Join选择表1中使用"select"关键字提及的所有列,以及表2中与"on"关键字后面的条件匹配的列 .类似地,根据定义:右连接选择表2中使用“select”关键字提及的所有列,以及表1中与“on”关键字后面的条件匹配的列 .
参考您的问题,将两个表中的id与需要在输出中抛出的所有列进行比较 . 因此,ids 1和2在两个表中都很常见,因此在结果中,您将有四列具有来自第一和第二表的id和name列的列 .
*select * from Table1 left join Table2 on Table1.id = Table2.id
上面的表达式,它从表1和列中获取所有记录(行),表2中的表1和表2中的匹配id .
select * from Table2 right join Table1 on Table1.id = Table2.id**
与上面的表达式类似,它从表1和列中获取所有记录(行),表2中包含表1和表2中的匹配id . (记住,这是一个右连接,因此table2中的所有列都没有从table1将被考虑) .