对于INNER连接,不,顺序不重要。查询将返回相同的结果,只要您将SELECT *改为SELECT a.*, b.*, c.*。
对于(LEFT, RIGHT或FULL) OUTER连接,是的,顺序很重要——而且(更新后的)事情要复杂得多。
首先,外部连接是不可交换的,所以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
but:
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
这相当于一个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 a.x <= b.x或ON a.x = 7或ON a.x like b.x或ON (a.x, a.y) = (b.x, b.y),这两个查询仍然是等效的。
但是,如果这些查询中的任何一个涉及到IS NULL或与COALESCE()等NULL相关的函数,例如,如果条件是b.ab_id IS NULL,那么这两个查询就不相等。