SQL中的不同连接逻辑

SQL中的不同连接逻辑,sql,sql-server,join,Sql,Sql Server,Join,我基本上是想了解连接的两种不同使用方式 (一) (二) 现在我有了一个SQLFiddle演示来尝试并展示这一点,但是查询给出了相同的结果。但是,我知道这两个查询在其他场景中产生了不同的结果 我发现很难理解它们。这3个查询之间有什么区别?在什么情况下我会使用它们?如果我理解您的问题“Join和left Join之间有什么区别” 当您只说join时,它就是所谓的内部连接,它只会在键匹配时从表中返回记录 当您说left join时,它是一个外部连接,这意味着它将返回表1中的所有行以及表2中没有键匹配的

我基本上是想了解连接的两种不同使用方式

(一)

(二)

现在我有了一个SQLFiddle演示来尝试并展示这一点,但是查询给出了相同的结果。但是,我知道这两个查询在其他场景中产生了不同的结果


我发现很难理解它们。这3个查询之间有什么区别?在什么情况下我会使用它们?

如果我理解您的问题“Join和left Join之间有什么区别”

当您只说join时,它就是所谓的内部连接,它只会在键匹配时从表中返回记录

当您说left join时,它是一个外部连接,这意味着它将返回表1中的所有行以及表2中没有键匹配的匹配行。表2的字段将全部为空


如果where条件Table2.Date>='2004-01-01'过滤掉了所有的空值,那么得到相同结果的原因就是在这种情况下,有效地将外部联接转换为内部联接

如果我理解您的问题“联接和左联接之间的区别是什么”

select * 
from Table1
JOIN Table2 ON Table1.ID = Table2.TableFK AND Table2.Date >= '2004-01-01'
WHERE Table1.Name LIKE 'S%';
当您只说join时,它就是所谓的内部连接,它只会在键匹配时从表中返回记录

当您说left join时,它是一个外部连接,这意味着它将返回表1中的所有行以及表2中没有键匹配的匹配行。表2的字段将全部为空

如果where条件Table2.Date>='2004-01-01'过滤掉所有空值,则得到相同结果的原因是在这种情况下,有效地将外部联接转换为内部联接查询1:

select * 
from Table1
JOIN Table2 ON Table1.ID = Table2.TableFK AND Table2.Date >= '2004-01-01'
WHERE Table1.Name LIKE 'S%';
它以相同的ID连接表1和表2。得到结果后,它将再次过滤数据,并获得日期为“2004-01-01”的数据


问题2:

将表1和表2合并,以获得具有相同ID和日期“2004-01-01”的数据。(结果将仅抛出与两个筛选器匹配的数据)


问题3:

几乎与查询2相同。区别仅在连接左连接之间


您应该在Google中找到加入左加入之间的区别,以及Stackoverflow中回答的任何问题。如果你想知道的,没有找到,你可以创建一个新的问题,并请标记我。只要我知道答案,我就会帮助你


*干杯*

查询1:

它以相同的ID连接表1和表2。得到结果后,它将再次过滤数据,并获得日期为“2004-01-01”的数据


问题2:

将表1和表2合并,以获得具有相同ID和日期“2004-01-01”的数据。(结果将仅抛出与两个筛选器匹配的数据)


问题3:

几乎与查询2相同。区别仅在连接左连接之间


您应该在Google中找到加入左加入之间的区别,以及Stackoverflow中回答的任何问题。如果你想知道的,没有找到,你可以创建一个新的问题,并请标记我。只要我知道答案,我就会帮助你



*干杯*

  • 它结合了唱片
  • 它过滤记录
  • 通过
    将Table1.ID=Table2.TableFK上的Table2连接起来,您可以说“给我Table2中匹配的记录”。所以你把唱片组合起来。但您也会说“从表1中删除不匹配的记录”。所以你过滤结果

    当添加
    其中Table2.Date>='2004-01-01'
    和Table2.Date>='2004-01-01'
    时,将进一步限制结果。使用
    WHERE
    的思想是“在链接ID上连接记录,然后从结果中删除日期不匹配的记录”。另一方面,将
    添加到
    ON
    子句中,思想是“只连接符合条件的记录”。但是两者都做相同的事情,DBMS将对这两个查询使用相同的执行计划

    使用外部联接则有所不同,因为您可以合并记录,但不进行过滤。如果表2中没有匹配的记录,您仍然保留表1中的记录。您会说:“将我的Table1记录与零到n的maching Table2记录相结合”,其中“匹配”表示当然匹配ID和日期范围。如果将
    放置在Table2.Date>=“2004-01-01”
    的位置,而不是将日期条件添加到
    ON
    子句中,则会忽略所有外部联接记录,因为在外部联接记录(其中Table1记录在Table2中不匹配)中
    Table2.Date
    将为空。突然之间,你会进行过滤,从而将你的外部连接变成内部连接。这是初学者经常犯的错误

    因此,一些人建议将所有标准始终放在
    条款的
    中。因此,如果您想在某个时候将查询转换为外部联接,就不会落入上述陷阱。但是,在
    FROM
    子句中还有表的顺序。您首先创建的表没有
    ON
    子句。你可以打开这个内部连接

    select * 
    from Table1
    JOIN Table2 ON Table1.ID = Table2.TableFK AND Table2.Date >= '2004-01-01'
    WHERE Table1.Name LIKE 'S%';
    
    容易地与外部连接

    LEFT JOIN Table2 ON Table1.ID = Table2.TableFK AND Table2.Date >= '2004-01-01'
    
    但是,如果您想将表1连接到表2

    RIGHT JOIN Table2 ON Table1.ID = Table2.TableFK AND Table2.Date >= '2004-01-01'
    
    将失败,您必须重新编写查询。(无论如何都应该这样做,因为
    右连接
    被认为比
    左连接
    更难阅读,因此应该避免。)

    话虽如此:对于外部联接,您必须将所有条件放入
    中。对于内部联接,将由您决定在何处放置其他条件

    更新:我看到您已更改了请求,不再询问内部joi
    select * 
    from Table1
    LEFT JOIN Table2 ON Table1.ID = Table2.TableFK
    WHERE Table2.Date >= '2004-01-01'
    
    select * 
    from Table1
    LEFT JOIN Table2 ON Table1.ID = Table2.TableFK
    AND Table2.Date >= '2004-01-01'