Для 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
но:
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 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(), например, если условие было выполнено b.ab_id IS NULL, то два запроса не будут эквивалентны.
<blahblah>? Вы соединяете А с В и А с С, или вы соединяете А с В и В с С?