Görünüşe göre iki veya daha fazla tabloyu birleştirmek gibi, ya birleştirme ya da nerede kullanabiliriz. Birinin diğerine göre avantajları nelerdir?
Görünüşe göre iki veya daha fazla tabloyu birleştirmek gibi, ya birleştirme ya da nerede kullanabiliriz. Birinin diğerine göre avantajları nelerdir?
Yanıtlar:
Birden fazla tabloyu içeren herhangi bir sorgu, "A" tablosundaki sonuçları "B" tablosuna bağlamak için bir tür ilişkilendirme gerektirir. Bunu yapmanın geleneksel (ANSI-89) yolu:
Tablolar arasındaki ilişkiyi WHERE yan tümcesine yazın
SELECT *
FROM TABLE_A a,
TABLE_B b
WHERE a.id = b.id
ANSI-92 JOIN sözdizimi kullanılarak yeniden yazılan sorgu:
SELECT *
FROM TABLE_A a
JOIN TABLE_B b ON b.id = a.id
Desteklendiği yerlerde (Oracle 9i +, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), her iki sözdizimini diğerine göre kullanmanın hiçbir performans avantajı yoktur. İyileştirici bunları aynı sorgu olarak görür. Ancak daha karmaşık sorgular ANSI-92 sözdiziminin kullanımından yararlanabilir:
ANSI-89 üzerinden ANSI-92 JOIN sözdizimini kullanmanın birçok nedeni vardır:
ANSI-92 JOIN sözdizimi kalıptır, örüntü önleyici değildir:
Aşinalık ve / veya rahatlık kısa, ANSI-92 JOIN sözdizimi yerine ANSI-89 WHERE yan tümcesini kullanmaya devam etmenin herhangi bir faydası görmüyorum. Bazıları ANSI-92 sözdiziminin daha ayrıntılı olduğundan şikayet edebilir, ancak bu onu açık hale getirir. Ne kadar açık olursa, anlamak ve sürdürmek o kadar kolay olur.
Çoğu insan, JOIN sözdizimini neye neye katıldığı konusunda biraz daha net bulma eğilimindedir. Ayrıca standart olma avantajına sahiptir.
Kişisel olarak, WHEREs'de "büyüdüm", ancak JOIN sözdizimini ne kadar çok kullanırsam, bunun daha net olduğunu görmeye başladım.
Where sözdizimini (örtük birleştirme olarak bilinen diğer akıllıca) kullanmanın sorunları şunlardır:
İlk olarak, birleştirme koşulları tablo adlarının hemen yanında olmadığından, yanlışlıkla çapraz birleşimler elde etmek çok kolaydır. Birleştirilmiş 6 tablonuz varsa, where cümlesinde birini gözden kaçırmak kolaydır. Farklı anahtar kelimeyi kullanarak bunun çok sık düzeltildiğini göreceksiniz. Bu, veritabanı için büyük bir performans darbesi. Sözdizimi denetiminde başarısız olacağından, açık birleştirme sözdizimini kullanarak yanlışlıkla bir çapraz birleşim elde edemezsiniz.
Bazı veritabanlarında eski sözdiziminde sağ ve sol birleşimler sorunludur (SQl sunucusunda doğru sonuçları alacağınız garanti edilmez). Ayrıca bildiğim SQL Server'da kullanımdan kaldırıldılar.
Çapraz birleştirme kullanmayı düşünüyorsanız, bu eski sözdiziminden anlaşılmıyor. Mevcut ANSII standardını kullanarak açıktır.
Bakımcı için, örtük sözdizimini kullanarak hangi alanların birleşimin parçası olduğunu ve hatta hangi tabloların hangi sırayla birleştiğini görmek çok daha zordur. Bu, sorguları gözden geçirmenin daha fazla zaman alabileceği anlamına gelir. Açık birleştirme sözdizimi ile kendilerini rahat hissetmek için zaman ayırdıklarında eski yola geri dönen çok az insan tanıyorum.
Ayrıca, bu örtük birleştirmeleri kullanan bazı kişilerin aslında birleştirmelerin nasıl çalıştığını anlamadıklarını ve bu nedenle sorgularında yanlış sonuçlar aldıklarını fark ettim.
Açıkçası, 18 yıl önce daha iyi bir yöntemle değiştirilen başka herhangi bir kod kullanır mıydınız?
Açık birleşimler amacı iletir ve filtrelemeyi yapmak için where cümlesini bırakır. Daha temiz ve standarttır ve sol dış veya sağ dış gibi sadece nerede yapılması daha zor şeyler yapabilirsiniz.
İki tabloyu birleştirmek için WHERE kullanamazsınız. Yine de yapabileceğiniz şey yazmaktır:
SELECT * FROM A, B
WHERE ...
Buradaki virgül, yazmakla eşdeğerdir:
SELECT *
FROM A
CROSS JOIN B
WHERE ...
Bunu yazar mısın? Hayır - çünkü demek istediğin bu değil. Çapraz birleşme istemiyorsunuz, bir INNER JOIN istiyorsunuz. Ama virgül yazdığınızda, CROSS JOIN diyorsunuz ve bu kafa karıştırıcı.
Aslında çoğu zaman hem "NEREDE" hem de "KATILIN" gerekir.
"JOIN", ortak bir sütunun değerlerine bağlı olarak iki tablodan veri almak için kullanılır. Daha sonra bu sonucu daha fazla filtrelemek isterseniz, WHERE yan tümcesini kullanın.
Örneğin, "LEFT JOIN" soldaki tablodan TÜM satırları artı sağ tablodan eşleşen satırları alır. Ancak bu, belirli bir değere veya JOIN'in parçası olmayan diğer sütunlara ilişkin kayıtları filtrelemez. Bu nedenle, bu sonucu daha fazla filtrelemek istiyorsanız, WHERE yan tümcesinde ekstra filtreleri belirtin.