5 min read

SQL JOIN ile Kayıt Birleştirme

Bu yazıda sql sorgularında kayıt birleştirme amacıyla kullanılan JOIN ifadesinin çeşitli kullanım şekillerini inceliyoruz.
SQL JOIN ile Kayıt Birleştirme

Daha önceki yazılarda SQL ile kayıt okuma/yazma ve çeşitli koşullar, gruplamalar getirme, ortalama alma vb. işlemler yapmıştık.

SQL SELECT ile kayıt sorgulama
Bu yazıda yeni başlayanlar veya tekrar yapmak isteyenler için SQL ile çeşitli sorgulama örnekleri yazıyoruz.
SQL ile kayıt düzenleme : INSERT, UPDATE, DELETE
Bu yazıda veritabanına yeni kayıt ekleme, kayıt güncelleme ve kayıt silme işlemleri yapıyoruz.
SQL ile karmaşık sorgular yazma
Bu yazıda karmaşık sorgular yazmaya yarayan count, sum, avg, max, group by, exists gibi ifadeleri örneklerle uyguluyoruz.

Bu yazıda tablo birleştirme yani JOIN ifadesini inceleyeceğiz. Veritabanı işlemlerinde sıklıkla lazım olan tablo birleştirmeyi bir kaç farklı şekilde yapabiliyoruz. Şimdi bunları örnekler üzerinden görelim.

JOIN ile tablo birleştirmenin 4 yolu

Tabloları birleştirirken karşımıza 4 farklı istek çıkar. Bunlar:

  1. İki tablodan sadece eşleşen kayıtlar gösterilsin (inner join)
  2. Soldaki tablodaki kayıtların sağ tarafta eşi olmasa da gösterilsin (left join)
  3. Sağdaki tablodaki kayıtların sol tarafta eşi olmasa da gösterilsin (right join)
  4. İki tablodaki kayıtlar hiç eşleşmese de gösterilsin (full join)
Bunların ilki inner join, diğerleri birer outer join'dir. Ama outer joinler kısaca left, right ve full join diye adlandırılırlar.

İlk senaryo: inner join yani kesişim kümesi alma

Diyelim ki müşteri ve sipariş kayıtlarını birleştirerek, siparişleri ve bunları veren kişileri tek listede görmek istiyoruz. Ama hiç sipariş vermeyen bir müşteriyi, veya müşteri bilgisi olmayan bir siparişi listede görmek istemiyoruz.

Bu durumda tam bir kesişim istiyoruz demektir. İşte bu tür birleştirmeye INNER JOIN adı verilir. Sadece JOIN kelimesi kullandığımızda aslında inner join yapılır.

Şimdi solda siparişleri sağda müşterileri alarak her sipariş ile foreign key üzerinden eşleştiği müşteri kaydını birleştirelim.

Bu birleşimde anahtarı yani müşteri numarası NULL olan siparişler öteki tabloda eşi olmadığından gösterilmez.

use northwind;
SELECT o.order_date, o.ship_city, o.shipping_fee, c.first_name, c.last_name, c.company 
FROM orders o JOIN customers c 
ON o.customer_id = c.id;
Solda sipariş, sağda müşteri şeklinde bir join örneği. Müşterisi yazmayan kayıt gösterilmemiş.
86 no.lu sipariş kaydının müşteri numarası yerine NULL verilmiş. Üstteki birleşimde bu kayıt yoktu.

Aynı işlemi tabloları ters çevirerek yaptığımızda bazı kayıtların tekrarladığını görürüz. Çünkü soldaki bazı müşterilerin sağ tarafta eşleştiği birden fazla sipariş kaydı bulunuyor.

Solda müşteri, sağda sipariş şeklinde bir join örneği

İkinci senaryo: left join yani sağ tarafın opsiyonel alınması

Inner join ile solda sipariş ve sağda müşteri tablosunu birleştirdiğimizde, müşteri bilgisi olmayan kayıt getirilmemişti. Fakat bu kaydı da görmek istediğimizi farzedelim. Bu durumda sağ taraftaki bilginin opsiyonel olduğunu düşünüyorsak ve sağda kayıt olmasa bile soldaki kaydı görmek istiyorsak, LEFT JOIN ile soldan birleştirme yaparız.

JOIN yerine LEFT JOIN yapıldığında artık sağda eşi olmayan kayıt da görülüyor.

Bir diğer örnek olarak, siparişleri ve varsa karşısında taşıyıcıları listeleyelim. Bazı siparişlerde taşıyıcı firma bilgisi girilmemiş olsa da bunları da görebileceğiz.

LEFT JOIN ile sağdaki şirket tablosunda karşılığı olmayan siparişleri de görüyoruz

Üçüncü senaryo: right join yani sol tarafın opsiyonel alınması

Yukarıdaki durumun ters çevrilmiş halini düşünelim. Solda şirketler, sağda siparişler olsun. Bazı siparişlerde şirket bilgisi olmadığından bunların tümünü görebilmek için sağdan birleştirme ile yani right join ile listelememiz gerekir.

RIGHT JOIN ile soldaki şirket tablosunda eşi olmasa da sağdaki bütün siparişleri görüyoruz

Dördüncü senaryo: full join yani eşleşmeye bakmayarak birleştirme

Bazen karşılıklı olarak eşleşmeyen kayıtlar içeren tablolarımız olur. Örneğin bir ürün tablosu ve bir de üretici firma tablosu gibi. Yalnız bazı ürünlerin üreticisi yok, bazı üreticilerin de ürün tablosunda karşılık gelen bir ürünü yok.

Bu durumda olduğu gibi hem sağ, hem sol tarafta eşi olmayan kayıtlar olabiliyorsa, yani iki tarafta da opsiyonel bir eşleşme söz konusu ise, bu durumda full join ile eşleşme şartı konmadan birleştirme yapılabilir.

MsSQL'de bu amaçla full outer join ifadesi kullanabilirsiniz. Mysql'de ise bu durum left join ve right join alınıp, sonuçlar da UNION ile eklemlenerek simüle edilebiliyor.

Son söz.

Bu yazıda sql sorgularında kayıt birleştirme amacıyla kullanılan JOIN ifadesinin çeşitli kullanım şekillerini inceledik. Bütün bu örneklerden sonra tek cümle ile özetlemek gerekirse: kayıtları birleştirirken bir taraftaki bilginin opsiyonel olduğu, veya iki taraftan da eşleşme olmasının istendiği gibi farklı durumlara göre farklı yöntemler kullanmak gerektiğini hatırlamak gerekiyor.

Eğer siz de bu yazı dizisinde üzerinden geçtiğimiz sql ifadelerini kullanarak kendi aklınızdan geçen çeşitli sorguları yazmaya çalışırsanız, sql diline olan hakimiyetinizi pekiştirebilirsiniz. Sonuçta ne kadar çok ve zorlu problemler çözerseniz o kadar deneyim elde edersiniz. İleride sql egzersizleri üzerine de bir yazı hazırlamayı düşünüyorum. Umarım o da faydalı olur.

Size şimdiden kolay gelsin, diğer yazılarda görüşmek üzere, hoşçakalın.