SQL Left Join ve Right Join Sorguları
SQL meraklısı veritabanı uzmanlarına ve yazılımcılara selamlar olsun :)
Son veritabanı makalelerimizde SQL join sorgularını öğrendiğimiz bu aralarda SQL full outer sorgusundan sonra sıra left join ve right join konusunu öğrenmeye geldi..
Öncelikle SQL join sorgularının tablolar arasındaki ilişkisini aşağıdaki görselden hatırlayalım:
Left join ve right join görsellerine baktığımızda birbirlerinin simetrik biçimde olduklarını görüyoruz ve diyoruz ki "özellikle hangi tablodaki kesin verilere ulaşmak istiyorsak o tabloyu left ya da right join olarak hedefleriz".
Şöyle bir mantık yürütelim; müşteriler ve o müşterilere ait sepetlerin listesini dökelim ancak her müşterinin sipariş vermediğini varsayalım.Bizden istenen ise müşteri sipariş versin ya da vermesin mutlaka adının listede geçmesi ve sipariş vermişse karşısında sepetleri gelsin.
Böyle bir durumda sipariş vermiş müşterinin karşısında sepetlerinin listesi gelecek ancak siparişi olmayan müşterinin karşısında ise sepeti olmadığı için null (boş) değerler yer alacak.Zaten bizden asıl istenen siparişler değil siparişi veren müşteriler olduğu için tam da böyle bir sorgu için left ya da right join kullanmak biçilmiş bir kaftan olacak.
Eğer aynı sorguyu inner join olarak yapsaydık bu defa sadece siparişi olan müşteriler ve sepetleri gelecekti ancak bizden beklenen siparişi olsun olmasın tüm müşterilerin listesini getirmek..
Peki sorgumuz nasıl olmalı?
Select * from Musteriler musteri
left join Sepetler sepet
on musteri.MusteriID=sepet.MusteriID
şeklinde bir sorgu yazarız.Dikkat ederseniz select sorgumuz Sepetler tablosuyla başladı ancak left join'i Musteriler tablosuna atadık.Aynı sorguyu right join ile yazmak istersek:
Select * from Sepetler sepet
right join Musteriler musteri
on musteri.MusteriID=sepet.MusteriID
şeklinde olmaktadır.
Her iki sorguyu gözümüzün önünde hayal edersek aslında right ya da left join farketmeksizin join yaptığımız tabloya öncelik tanımış oluyoruz.
Buraya kadar yaptıklarımızı şimdi pratiğe dökelim ama önce BakkalDB örnek veritabanımızın tasarımını hatırlayalım:
Aynı örnekten devam edelim ve iki ayrı select sorgusu ile hem müşteriler hem de sepetler tablosundaki kayıtları listeleyelim:
Bu kayıtlara göre her müşterinin sipariş kaydı olmadığı için left ya da right join kullanacağız.İlk olarak sorgumuzu left join ile yazalım:
ve tam da beklediğimiz gibi siparişi olsun ya da olmasın tüm müşteri listesini ve sepetlerini listeledik,son iki müşterimizin ise hiçbir siparişi olmadığını görüyoruz.Aynı sorguyu right join ile deneyelim:
Sonuç yine aynı..Peki aynı sorguyu inner join olarak deneyelim:
Dikkat ederseniz inner joinin getirdiği listenin sayısı 1196 iken left veya right join ile yapılan sorgu sayısı 1198 olarak daha az geldi çünkü inner join mutlaka ama mutlaka her iki tablodan null gelmeyen kayıtları listeler.Yani inner join siparişi olmayan son iki müşterimiz listede yer almadı.
SQL left join ya da right join kullanımı arasında bir fark yok sadece gözünüzün önünde hayal edeceğiniz tabloyu sola ya da sağa koyarak hangisinden önemli dataları çekmek istiyorsanız ona göre left ya da right join kullanmanız gerekmektedir.
Böylece bir veritabanı makalemizin daha sonuna gelmiş bulunmaktayız,bir sonraki makalemizde görüşmek üzere hoşçakalın esen kalın. :)
Son veritabanı makalelerimizde SQL join sorgularını öğrendiğimiz bu aralarda SQL full outer sorgusundan sonra sıra left join ve right join konusunu öğrenmeye geldi..
Öncelikle SQL join sorgularının tablolar arasındaki ilişkisini aşağıdaki görselden hatırlayalım:
Left join ve right join görsellerine baktığımızda birbirlerinin simetrik biçimde olduklarını görüyoruz ve diyoruz ki "özellikle hangi tablodaki kesin verilere ulaşmak istiyorsak o tabloyu left ya da right join olarak hedefleriz".
Şöyle bir mantık yürütelim; müşteriler ve o müşterilere ait sepetlerin listesini dökelim ancak her müşterinin sipariş vermediğini varsayalım.Bizden istenen ise müşteri sipariş versin ya da vermesin mutlaka adının listede geçmesi ve sipariş vermişse karşısında sepetleri gelsin.
Böyle bir durumda sipariş vermiş müşterinin karşısında sepetlerinin listesi gelecek ancak siparişi olmayan müşterinin karşısında ise sepeti olmadığı için null (boş) değerler yer alacak.Zaten bizden asıl istenen siparişler değil siparişi veren müşteriler olduğu için tam da böyle bir sorgu için left ya da right join kullanmak biçilmiş bir kaftan olacak.
Eğer aynı sorguyu inner join olarak yapsaydık bu defa sadece siparişi olan müşteriler ve sepetleri gelecekti ancak bizden beklenen siparişi olsun olmasın tüm müşterilerin listesini getirmek..
Peki sorgumuz nasıl olmalı?
Select * from Musteriler musteri
left join Sepetler sepet
on musteri.MusteriID=sepet.MusteriID
şeklinde bir sorgu yazarız.Dikkat ederseniz select sorgumuz Sepetler tablosuyla başladı ancak left join'i Musteriler tablosuna atadık.Aynı sorguyu right join ile yazmak istersek:
Select * from Sepetler sepet
right join Musteriler musteri
on musteri.MusteriID=sepet.MusteriID
şeklinde olmaktadır.
Her iki sorguyu gözümüzün önünde hayal edersek aslında right ya da left join farketmeksizin join yaptığımız tabloya öncelik tanımış oluyoruz.
Buraya kadar yaptıklarımızı şimdi pratiğe dökelim ama önce BakkalDB örnek veritabanımızın tasarımını hatırlayalım:
Aynı örnekten devam edelim ve iki ayrı select sorgusu ile hem müşteriler hem de sepetler tablosundaki kayıtları listeleyelim:
Bu kayıtlara göre her müşterinin sipariş kaydı olmadığı için left ya da right join kullanacağız.İlk olarak sorgumuzu left join ile yazalım:
ve tam da beklediğimiz gibi siparişi olsun ya da olmasın tüm müşteri listesini ve sepetlerini listeledik,son iki müşterimizin ise hiçbir siparişi olmadığını görüyoruz.Aynı sorguyu right join ile deneyelim:
Sonuç yine aynı..Peki aynı sorguyu inner join olarak deneyelim:
Dikkat ederseniz inner joinin getirdiği listenin sayısı 1196 iken left veya right join ile yapılan sorgu sayısı 1198 olarak daha az geldi çünkü inner join mutlaka ama mutlaka her iki tablodan null gelmeyen kayıtları listeler.Yani inner join siparişi olmayan son iki müşterimiz listede yer almadı.
SQL left join ya da right join kullanımı arasında bir fark yok sadece gözünüzün önünde hayal edeceğiniz tabloyu sola ya da sağa koyarak hangisinden önemli dataları çekmek istiyorsanız ona göre left ya da right join kullanmanız gerekmektedir.
Böylece bir veritabanı makalemizin daha sonuna gelmiş bulunmaktayız,bir sonraki makalemizde görüşmek üzere hoşçakalın esen kalın. :)