For INNER
加入,不,顺序无关紧要。只要您更改选择,查询就会返回相同的结果SELECT *
to SELECT a.*, b.*, c.*
.
For (LEFT
, RIGHT
or FULL
) OUTER
加入,是的,顺序很重要 - 并且(updated)事情要复杂得多。
首先,外连接是不可交换的,所以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
This 是等价的 to 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
and c.bc_id = b.bc_id
是平等检查并且不涉及NULL
比较。
您甚至可以使用其他运算符或更复杂的条件,例如:ON a.x <= b.x
or ON a.x = 7
or ON a.x LIKE b.x
or ON (a.x, a.y) = (b.x, b.y)
并且这两个查询仍然是等效的。
但是,如果其中任何一项涉及IS NULL
或与 null 相关的函数,例如COALESCE()
,例如如果条件是b.ab_id IS NULL
,那么这两个查询将不等价。