包含多个联接的SQL语句如何工作?

包含多个联接的SQL语句如何工作?,sql,database,Sql,Database,我正在学习加入我的课堂,但我没有完全掌握一些概念。有人能解释一个包含多个连接的语句是如何工作的吗 SELECT B.TITLE, O.ORDER#, C.STATE FROM BOOKS B LEFT OUTER JOIN ORDERITEMS OI ON B.ISBN = OI.ISBN LEFT OUTER JOIN ORDERS O ON O.ORDER# = OI.ORDER# LEFT OUTER JOIN CUSTOMERS C ON C.CUSTOMER# = O

我正在学习加入我的课堂,但我没有完全掌握一些概念。有人能解释一个包含多个连接的语句是如何工作的吗

SELECT B.TITLE, O.ORDER#, C.STATE FROM BOOKS B
   LEFT OUTER JOIN ORDERITEMS OI ON B.ISBN = OI.ISBN
   LEFT OUTER JOIN ORDERS O ON O.ORDER# = OI.ORDER#
   LEFT OUTER JOIN CUSTOMERS C ON C.CUSTOMER# = O.CUSTOMER#;
我相信我理解BOOKS表是连接BOOKS和ORDERITEMS的第一个外部联接中的左表。即使没有书籍的ORDERITEM,也会显示所有书籍。在第一次加入之后,我不确定到底发生了什么

合并订单时,哪个是左表,哪个是右表?顾客也一样。这就是我迷路的地方


我最喜欢的在线资源之一是:

至于你的问题

将显示所有书籍,并且仅显示与书籍匹配的订单项 只有那些在orderitems中有相关记录且与书籍相关的订单才会显示 仅列出订单中包含books表中项目的客户

因此,没有订单的客户将不会被列出 拥有订单但订购非书籍项目的客户将不会被列出

有趣的东西。希望你喜欢

关于第二个问题:右/左只起作用,因为from语句中表的顺序。如果重新安排表顺序,可以使每个联接都成为左联接。All right/left do是指定要从中获取所有记录的表

考虑:您可以轻松地更正select语句,如下所示:

选择B.标题、O.订单、C.状态 来自客户C 右外部连接订单O ON C.CUSTOMER=O.CUSTOMER O.ORDER=OI.ORDER上的右外部联接ORDERITEMS OI B.ISBN=OI.ISBN上的右外连接书本B

在本例中,right是指我想要右边表中的所有记录,因为books是列表中的最后一个,所以您将获得所有书籍,并且只有那些与书籍相关的ordereditems,只有那些订单项为书籍的订单,以及只有那些订单项为书籍的客户。因此,除了顺序外,左/右是相同的。为了可读性,我避免使用正确的连接。我发现,在考虑哪些内容包括哪些内容不包括时,更容易自上而下

被排除的记录在这些类型的联接中将具有空值


希望这对您有所帮助。

executor将执行的第一件事-获取第一对符合加入条件的表并执行加入。在以下步骤中,上一次连接的结果被视为虚拟关系,因此您再次拥有类似于。。。从虚拟选项卡左侧加入真实选项卡。。。。此行为基于中使用的,这意味着关系上的任何操作都会生成关系,即操作可以嵌套。RDBMS代表关系型DBMS,请看链接的维基百科文章


到目前为止,我发现PostgreSQL的文档在这方面最具权威性。在链接的文章中,对数据库如何执行连接进行了一般性概述,并提供了一些特定于PostrgeSQL的内容,这是意料之中的。

Reference+1值得指出的是,控制联接逻辑顺序的是ON子句的位置,而不是表。@vyegorov我没有意识到它从第一个联接获取集合,然后将该虚拟集合用于下一个联接。谢谢