Для 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>
? Вы соединяете А с В и А с С, или вы соединяете А с В и В с С?