Sql server 确定哪一个表位于联接的右侧和左侧

Sql server 确定哪一个表位于联接的右侧和左侧,sql-server,tsql,join,adventureworks,Sql Server,Tsql,Join,Adventureworks,我对右外连接和左外连接很困惑。我对如何正确使用它们感到困惑。我所知道的唯一正确的连接是内部连接。我想问一些愚蠢的问题,但我问这些问题是为了让我能正确地理解它们 我怎么知道哪张桌子在右边和左边。这是由哪个连接决定的吗? 我问这些问题是因为我使用的是AdventureWorks数据库,我在下面的查询中做了一个左连接 Select SalesLT.Customer.CompanyName, SalesLT.SalesOrderHeader.SubTotal, SalesLT.SalesOrderHea

我对右外连接和左外连接很困惑。我对如何正确使用它们感到困惑。我所知道的唯一正确的连接是内部连接。我想问一些愚蠢的问题,但我问这些问题是为了让我能正确地理解它们

我怎么知道哪张桌子在右边和左边。这是由哪个连接决定的吗? 我问这些问题是因为我使用的是AdventureWorks数据库,我在下面的查询中做了一个左连接

Select SalesLT.Customer.CompanyName, SalesLT.SalesOrderHeader.SubTotal, SalesLT.SalesOrderHeader.TaxAmt
FROM SalesLT.Customer
LEFT OUTER JOIN  SalesLT.SalesOrderHeader
ON  SalesLT.Customer.CustomerID  = SalesLT.SalesOrderHeader.CustomerID
这就是我得到的结果

A Bike Store                NULL    NULL
Progressive Sports          NULL    NULL
Advanced Bike Components    NULL    NULL
Modular Cycle Systems       NULL    NULL
Metropolitan Sports Supply  NULL    NULL
Aerobic Exercise Company    NULL    NULL
Associated Bikes            NULL    NULL
Rural Cycle Emporium        NULL    NULL
Sharp Bikes                 NULL    NULL
 Bikes and Motorbikes       NULL    NULL
在同一个查询中,我用右外部联接替换了左外部联接,得到了以下结果

Professional Sales and Service  39785.3304  3182.8264
Remarkable Bike Store           6634.2961   530.7437
Bulk Discount Store             88812.8625  7105.029
Coalition Bike Company          2415.6727   193.2538
Futuristic Bikes                246.7392    19.7391
Channel Outlet                  550.386     44.0309
Aerobic Exercise Company        2137.231    170.9785
Vigorous Sports Store           1059.31     84.7448
我真的很困惑。请给我解释一下这里发生了什么事。可能是因为我没有正确地连接。如果我错了,纠正我

谢谢

如果一个连接找到了所有行的匹配项,那么是的,它看起来就像一个内部连接。联接的外部部分是关于在找不到匹配项时发生的情况

左边或右边表示我们总是要保留哪些表的行。因此,在左联接中,您将始终获得联接左侧表中的所有行,但对于右侧不匹配的行,我们将获得null。对于右连接,我们总是将表中的所有行都移到右边

正如我所说,如果你在做一个左连接,并且左表中的每一行在右表中都至少有一个匹配行,那么结果将与内部连接相同。

如果一个连接找到所有行都匹配,那么是的,它将看起来像一个内部连接。联接的外部部分是关于在找不到匹配项时发生的情况

左边或右边表示我们总是要保留哪些表的行。因此,在左联接中,您将始终获得联接左侧表中的所有行,但对于右侧不匹配的行,我们将获得null。对于右连接,我们总是将表中的所有行都移到右边


正如我所说,如果你在做一个左连接,并且左表中的每一行在右表中都至少有一个匹配的行,那么结果将与内部连接一样。

返回所有有储物柜的学生

Select * from Student s 
inner join locker l on s.StudentId = l.StudentId
返回所有学生,无论他们是否有储物柜

Select * from Student s 
left join locker l on s.StudentId = l.StudentId

归还所有有储物柜的学生,以及所有储物柜(如果他们有或没有学生)

Select * from Student s 
right join locker l on s.StudentId = l.StudentId

归还所有有储物柜的学生

Select * from Student s 
inner join locker l on s.StudentId = l.StudentId
返回所有学生,无论他们是否有储物柜

Select * from Student s 
left join locker l on s.StudentId = l.StudentId

归还所有有储物柜的学生,以及所有储物柜(如果他们有或没有学生)

Select * from Student s 
right join locker l on s.StudentId = l.StudentId

我正在努力理解你所说的“我知道所有连接的定义”,如果你无法证明对连接的理解。可能的重复我将在@Damien_the_uncerver中编辑该部分左表是from子句中定义的表。选择*从学生左侧加入储物柜。。。将返回带或不带指定储物柜的学生。您的查询将返回所有客户,无论他们是否有SalesOrderheader,您能否至少解释一下,我的查询哪里出了问题?它没有解释为什么我使用右外部连接时,它的行为就像内部连接=。请向我解释@Damien_The_incensiver我正在努力理解你的意思,如果你无法证明对连接的理解,我知道所有连接的定义。可能的重复我将编辑该部分@Damien_The_incensiver左表是from子句中定义的表。选择*从学生左侧加入储物柜。。。将返回带或不带指定储物柜的学生。您的查询将返回所有客户,无论他们是否有SalesOrderheader,您能否至少解释一下,我的查询哪里出了问题?它没有解释为什么我使用右外部连接时,它的行为就像内部连接=。请向我解释一下“达米恩”这个不相信你的人,谢谢!!我更明白谢谢你!!我更明白