Açık açık alanlarda iki tablo arasında birleştirme ile ilk seçenek nedenlerle bir dizi için seçmek için daha iyi bir seçenektir.
İkinci seçenek etkin hala bir bir implied katılmak olarak size JOIN anahtar sözcüğünü kullanın bile katılın. Bu veritabanı motoru etkili bir tablo listesi arasında birleştirme sahibi oluyor gerçekleştirmek anlamına gelir.
MySQL, bu bir ÇAPRAZ MySQL ikinci sorgu iyi çalışabilir iken yani ancak bir INNER "standart" SQL JOIN eşdeğer bir ÇAPRAZ JOIN farkında DEĞİL olmak, bir INNER JOIN eşdeğer olan tarihi katılmak ima ise filtreleme, bu belirsiz nerede doğru düzgün inşa.
Sonuç olarak, ikinci sorgu ile (join zımni) etkin (bir tablodan etkin her satır başka bir tablodan her satırda ile kombine) iki tablo arasında bir Cartesian product üretebilir. Tablolardan en az birinin epeyce satır içeren özellikle eğer, neredeyse kesinlikle bu istemediğin olacak ve bir SQL sorgu performansını yok etmek için tek yol! Hatta eğer filtre hükümler (yani WHERE yan tümceleri) doğru sadece doğru sonuç kümesi dönmek istemiyorum satırları süzmek olabilir, bu açıkça tanımlanması daha az etkili olacak kendi açık (katıldığında bile, çoğu veritabanı motorları olacaktır olsa ) bu tür zımni sorguları optimize etme çabasında. İlk sorgu için bir açık LEFT JOIN ve böylece Kartezyen ürün shouldn't (- senin soru bu tablo ilişkisi "mantıklı" görünüyor size "mantıklı" alanlarında katılıyor varsayarak) mümkün kullanır.
Ayrıca, daha düşük, sadece ima ve öncelik virgül ayırıcı ile tablolar listeleyerek tablolar arasında birleştirme farkında edilmektedir olmak fiili açık (en azından MySQL v5.x beri) Bu, özellikle birleşim halinde, hatalı sorgu sonuçlara yol açabilir JOIN deyimleri Yine, sorgu ifadesinde belirsizlik zor öncelik belirlemek için yapar, ve böylece aynı sorgu veritabanı sürümleri arasında tamamen farklı sonuçlar üretebilir, 3 ya da daha fazla tablo arasında. this link daha fazla bilgi için bkz.
MySQL çeşitli JOIN türleri için en iyi bilgi kaynağı MySQL belgeleri kendisi ve sayfa özellikle burada bulabilirsiniz birleşimler ile ilgili:
12.2.8.1. JOIN Syntax (MySql v5)
12.2.9.1. JOIN Syntax (MySql v6)
Sadece hız için, aşağıda en uygun bölümleri alıntı ettik:
INNER JOIN ve, (virgül) katılmak durumun yokluğunda anlam eşdeğerdir: ikisi (yani ilk tablodaki her satırın ikinci tablodaki her satırda katılmış olduğu belirtilen tablolar arasında bir Kartezyen ürün üretmek .)
Ancak, virgül operatörünün öncelik böylece LEFT JOIN, ÇAPRAZ JOIN, JOIN INNER daha azdır, ve. Eğer karıştırırsanız virgül katılmak durum, 'yan tümcesi' form Bilinmeyen sütun 'col_name' bir hata oluşabilir olduğunda diğer türde katılabilirsiniz ile katıldı.
-
Multi-yolu doğal değerlendirilmesi DOĞAL veya KULLANMA katıldı sonucunu etkiler ve bu sorgu yeniden yazılmasında gerektirebilir çok önemli bir şekilde farklılık katılır. T1 (1,2), t2 (10,2) ve T3 (: üç tablo t1 (a, b), t2 (c, b) ve T3 (a, c) her biri satır olduğunu var olduğunu varsayalım 7,10). Bu DOĞAL üç tablo JOIN olması da varsayalım:
SELECT ... t1 DOĞAL T2 T3 DOĞAL JOIN;
O (t1 DOĞAL t2'yi JOIN) katılmak iç içe olması gerektiğini, oysa daha önce, katılmak ikinci sol terim t2 olarak kabul edildi. Sonuç olarak, T3 sütunları t3 t1 ile ortak sütunlar varsa sütunları eş birleştirmek gibi, bu sütunlar kullanılmaz, sadece t2 ortak sütunlar için kontrol ve edilir. Bu nedenle, daha önce, yukarıdaki sorgu aşağıdaki eş-katılması için transforme edildi:
SELECT ... FROM t1, t2, t3
WHERE t1.b = t2.b AND t2.c = t3.c;
Bu katılmak bir daha yüklemi eş birleştirmek eksik (t1.a = t3.a). Sonuç olarak, bir sıra değil, gerektiği boş bir sonuç üretmektedir. Doğru eşdeğer sorgusu şudur:
SELECT ... FROM t1, t2, t3
WHERE t1.b = t2.b AND t2.c = t3.c AND t1.a = t3.a;
Eğer eski sürümleri gibi MySQL güncel sürümleri aynı sorgu sonucu gerektiriyorsa, doğal birinci eş birleştirmek olarak katılmak yeniden.
-
Daha önce, virgül operatörü (,) ve JOIN hem de aynı önceliğe vardı, bu yüzden katılmak ifade t1, t2 t3 ((T1, T2) T3 JOIN) olarak yorumlandı JOIN. Şimdi KATIL yüksek önceliğe sahiptir, bu yüzden ifade (t1, (T2 T3 JOIN)) olarak yorumlanır. Bu fıkra katılmak, işlenen sütunlar sadece bakın, çünkü bu değişim, bir ON yan tümcesini kullanmak ifadeleri etkiler ve önceliği değişiklik olanlar işlenendir ne yorumunu değiştirir.
Örnek:
CREATE TABLE t1 (i1 INT, j1 INT);
CREATE TABLE t2 (i2 INT, j2 INT);
CREATE TABLE t3 (i3 INT, j3 INT);
INSERT INTO t1 VALUES(1,1);
INSERT INTO t2 VALUES(1,1);
INSERT INTO t3 VALUES(1,1);
SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3);
Daha önce, SELECT nedeniyle (T1, T2) gibi t1, t2 örtülü gruplama yasal oldu. Şimdi JOIN önceliklidir, yani ON yan tümcesi için işlenen T2 ve T3 vardır. T1.i1 işlenen ya da bir sütun olmadığından, sonuç hata 'maddesi üzerinde' bir Bilinmeyen sütun 't1.i1' dir. Izin vermek için, işlenecek birleştirme, grup parantez ile açık bir şekilde, ilk iki tablo ON madde için işlenen (t1, t2) ve t3 böylece:
SEÇİN * (T1, T2) DAN (t1.i1 = t3.i3) T3 JOIN;
Alternatif olarak, virgül operatörünün kullanımını önlemek ve bunun yerine JOIN kullanın:
SEÇİN * t1 t2 (t1.i1 = t3.i3) T3 Katılın;
Bu değişiklik de artık virgül operatöründen daha yüksek önceliğe sahip tüm bunların LEFT JOIN, ÇAPRAZ JOIN, JOIN INNER ile virgül operatörünü karıştırın ve RIGHT JOIN ifadeleri için de geçerlidir.