İçin INNER
katılır, hayır, sipariş önemli değildir. Sorgular sürece adresinin seçer değiştikçe, aynı sonuçları getirecektir SELECT *
için SELECT a.*, b.*, c.*
.
İçin ( LEFT
, RIGHT
ya FULL
) OUTER
, evet, sipariş konularda birleşimler - ve ( güncellenmiş ) işler çok daha karmaşıktır.
Birincisi, dış birleşimler değişmeli değildir, bu yüzden a LEFT JOIN b
aynı değildirb LEFT JOIN a
Dış birleşimler de birleştirici değildir, bu nedenle her iki (değişebilirlik ve ilişkilendirilebilirlik) özellikleri içeren örneklerinizde:
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
şuna eşittir :
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
fakat:
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
şuna eşdeğer değildir :
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
Bir başka (umarım daha basit) ilişkilendirilebilirlik örneği. Bunu şöyle düşünün (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
Bu eşdeğerdir için 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
sadece "güzel" ON
koşullarımız olduğu için. Hem ON b.ab_id = a.ab_id
ve c.bc_id = b.bc_id
eşitlik denetler ve içermeyen NULL
karşılaştırmalar.
Hatta gibi diğer operatörleri ile şartları veya daha karmaşık olanlar olabilir: ON a.x <= b.x
ya ON a.x = 7
ya ON a.x LIKE b.x
ya ON (a.x, a.y) = (b.x, b.y)
ve iki sorgular hala eşdeğer olacaktır.
Bununla birlikte, bunlardan herhangi biri IS NULL
veya null'larla ilgili bir işlev COALESCE()
, örneğin koşul varsa b.ab_id IS NULL
, iki sorgu eşdeğer olmazsa.
<blahblah>
? A'dan B'ye ve A'dan C'ye mi katılıyor, yoksa A'dan B'ye ve B'den C'ye mi katılıyor?