Sql 当使用左(外)联接时,联接中表的顺序是否重要?

Sql 当使用左(外)联接时,联接中表的顺序是否重要?,sql,postgresql,join,ansi-sql,Sql,Postgresql,Join,Ansi Sql,我想确认SQL查询 SELECT .... FROM apples, oranges LEFT JOIN kiwis ON kiwis.orange_id = oranges.id, bananas WHERE .... 完全等同于FROM子类中的其他置换,如 SELECT .... FROM oranges LEFT JOIN kiwis ON kiwis.orange_id = oranges.id, bana

我想确认SQL查询

SELECT ....
  FROM apples,
       oranges
       LEFT JOIN kiwis ON kiwis.orange_id = oranges.id,
       bananas
 WHERE ....
完全等同于FROM子类中的其他置换,如

SELECT ....
  FROM oranges
       LEFT JOIN kiwis ON kiwis.orange_id = oranges.id,
       bananas,
       apples
 WHERE ....

只要橙子和猕猴桃之间明显的左连接保持不变。从我在各种文档中读到的内容来看,返回的集合应该完全相同


我真正关心的是查询的结果,而不是它在实际数据库中的性能。(我使用的是PostgreSQL 8.3,AFAIK不支持优化器对连接顺序的提示,并将尝试自动创建最佳查询计划)。

我使用SQL已有多年,根据我的经验,表顺序并不重要。数据库将把查询视为一个整体,并创建最佳查询计划。这就是为什么数据库公司雇佣了许多在查询计划优化方面拥有博士学位的人


如果按照您个人在查询中列出SQL的顺序对数据库供应商进行优化,则该数据库供应商将进行商业自杀。

这是相同的,但对于隐式交叉联接来说,它是模棱两可的。使用显式联接

如果要加入WHERE子句,则结果可能会有所不同,因为联接和筛选器是混合的

SELECT ....
  FROM apples a
       JOIN
       bananas b ON ...
       JOIN 
       oranges o ON ...
       LEFT JOIN
       kiwis k ON k.orange_id = o.id
 WHERE (filters only)
注:

  • 内部连接和交叉连接是可交换和关联的:顺序通常并不重要
  • 外部联接不是您标识的
  • SQL是声明性的:你告诉乐观主义者你想要什么,而不是怎么做。这将删除连接顺序注意事项(以前2项为准)

情况总结如下。外部联接不会重新排序,内部联接可以重新排序。您可以通过在运行查询之前删除*join\u collapse\u limit*,然后按照您希望的顺序进行操作,从而强制执行特定的优化器顺序。这就是您在该区域中“提示”数据库的方式


通常,您需要使用EXPLAIN来确认您得到的顺序,有时还可以使用EXPLAIN来直观地确认两个查询得到的是相同的计划。

您测试过吗?
JOIN
s的顺序是不相关的,除非您需要以前的
JOIN
sIs香蕉、苹果、桔子的具体结果笛卡尔积?或者“join in WHERE”子句?EXPLAIN将向您展示:没有任何提示的理由,PostgreSQL非常聪明。旧版本的DBMS实际上就是这样做的(例如Oracle 7和8)。这通常被称为“基于规则的优化器”,因为它静态地查看查询,并根据查询的结构应用一些规则来确定执行计划。对于基于规则的优化器,第一个表通常是驱动表,因此顺序确实对性能有重大影响非常好和彻底的回答,谢谢。请注意,是的,连接条件在WHERE子句中。这是一个遗留应用程序,我正在重构一些查询。
SELECT ....
  FROM apples a
       JOIN
       bananas b ON ...
       JOIN 
       oranges o ON ...
       LEFT JOIN
       kiwis k ON k.orange_id = o.id
 WHERE (filters only)