SQL中的连接顺序是否重要?

无视performance,我会得到相同的结果从查询A和B下面? C和D怎么样?

-- A select * from a left join b on <blahblah> left join c on <blahblan> -- B select * from a left join c on <blahblah> left join b on <blahblan> -- C select * from a join b on <blahblah> join c on <blahblan> -- D select * from a join c on <blahblah> join b on <blahblan> 

对于INNERjoin,不,订单无关紧要。 只要您将select从SELECT *更改为SELECT a.*, b.*, c.*查询就会返回相同的结果。


对于( LEFTRIGHTFULLOUTERjoin,是的,订单很重要 – ( 更新 )的事情要复杂得多。

首先,外连接是不可交换的,所以a LEFT JOIN b不同于b LEFT JOIN a

外连接也不是关联的,所以在你的例子中涉及到(交换性和关联性)属性:

 a LEFT JOIN b ON b.ab_id = a.ab_id LEFT JOIN c ON c.ac_id = a.ac_id 

相当于

 a LEFT JOIN c ON c.ac_id = a.ac_id LEFT JOIN b ON b.ab_id = a.ab_id 

但:

 a LEFT JOIN b ON b.ab_id = a.ab_id LEFT JOIN c ON c.ac_id = a.ac_id AND c.bc_id = b.bc_id 

不等同于

 a LEFT JOIN c ON c.ac_id = a.ac_id LEFT JOIN b ON b.ab_id = a.ab_id AND b.bc_id = c.bc_id 

另一个(希望更简单)结合性的例子。 认为这是(a LEFT JOIN b) LEFT JOIN c

 a LEFT JOIN b ON b.ab_id = a.ab_id -- AB condition LEFT JOIN c ON c.bc_id = b.bc_id -- BC condition 

相当于 a LEFT JOIN (b LEFT JOIN c)

 a LEFT JOIN b LEFT JOIN c ON c.bc_id = b.bc_id -- BC condition ON b.ab_id = a.ab_id -- AB condition 

只是因为我们有“好”的ON条件。 ON b.ab_id = a.ab_idc.bc_id = b.bc_id都是相等性检查,不涉及NULL比较。

你甚至可以有其他操作符或者更复杂的条件,比如: ON ax <= bx或者ON ax = 7或者ON ax LIKE bxON (ax, ay) = (bx, by) ,这两个查询仍然是等价的。

但是,如果其中任何一个涉及到IS NULL或与像COALESCE()这样的空值相关的函数,例如,如果条件是b.ab_id IS NULL ,那么这两个查询将不等效。

对于经常join,它不。 TableA join TableB将产生与TableB join TableA相同的执行计划(所以你的C和D的例子将是相同的)

为左和右join它。 TableA left Join TableB不同于TableB left Join TableA ,但它与TableB right Join TableA