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