Đối với INNER
tham gia, không, thứ tự không quan trọng. Các truy vấn sẽ trả về kết quả tương tự, miễn là bạn thay đổi lựa chọn của mình từ SELECT *
thành SELECT a.*, b.*, c.*
.
Đối với ( LEFT
, RIGHT
hoặc FULL
) OUTER
tham gia, vâng, thứ tự quan trọng - và ( được cập nhật ) mọi thứ phức tạp hơn nhiều.
Đầu tiên, tham gia bên ngoài không giao hoán, vì vậy a LEFT JOIN b
không giống nhưb LEFT JOIN a
Các phép nối ngoài cũng không phải là kết hợp, do đó, trong các ví dụ của bạn có liên quan đến cả hai thuộc tính (giao hoán và kết hợp):
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
tương đương với :
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
nhưng:
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
không tương đương với :
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
Một ví dụ khác (hy vọng đơn giản hơn). Hãy nghĩ về điều này như (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
Điều này tương đương với 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
chỉ bởi vì chúng tôi có ON
điều kiện "tốt đẹp" . Cả hai ON b.ab_id = a.ab_id
và c.bc_id = b.bc_id
là kiểm tra bình đẳng và không liên quanNULL
so sánh.
Bạn thậm chí có thể có điều kiện với các nhà khai thác khác hoặc những phức tạp hơn như: ON a.x <= b.x
hay ON a.x = 7
hay ON a.x LIKE b.x
hayON (a.x, a.y) = (b.x, b.y)
và hai truy vấn vẫn sẽ tương đương.
Tuy nhiên, nếu bất kỳ điều nào trong số này liên quan IS NULL
hoặc một chức năng có liên quan đến null như COALESCE()
, ví dụ nếu điều kiện là b.ab_id IS NULL
, thì hai truy vấn sẽ không tương đương.
<blahblah>
? bạn đang tham gia A đến B và A đến C, hay bạn đang tham gia A đến B và B đến C?