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