Для 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>? Ви приєднуєтесь до А до В та від А до С, чи приєднуєтесь до А до В та В до С?