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>
对于INNER
join,不,订单无关紧要。 只要您将select从SELECT *
更改为SELECT a.*, b.*, c.*
查询就会返回相同的结果。
对于( LEFT
, RIGHT
或FULL
) OUTER
join,是的,订单很重要 – ( 更新 )的事情要复杂得多。
首先,外连接是不可交换的,所以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