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.*查询就会返回相同的结果。 
 对于( LEFT , RIGHT或FULL ) OUTERjoin,是的,订单很重要 – ( 更新 )的事情要复杂得多。 
 首先,外连接是不可交换的,所以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_id和c.bc_id = b.bc_id都是相等性检查,不涉及NULL比较。 
 你甚至可以有其他操作符或者更复杂的条件,比如: ON ax <= bx或者ON ax = 7或者ON ax LIKE bx或ON (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