SQL Inner Join Sorgusu
Uzun bir aradan sonra SQL meraklılarına yeniden selamlar :)
Veritabanı derslerimizin en başından beri normalizasyon konusunu öğrenmeye çalışıyor ve bu konuya göre profesyonel bir veritabanı tasarımı ile BakkalDB veritabanımızı geliştirmiştik.
Hatırlarsanız örnek veritabanımızdaki tabloları foreign key anahtarlama sistemi ile aralarındaki ilişkiye göre bağlamıştık:
Tablolar arası ilişkileri gerçekleştirdikten sonra veri girişi için SQL insert sorgusunu öğrenmiş ve bağlı tablolara veri girişlerini gerçekleştirmiştik.Bu sayede bir diğer tablodaki veriyi diğer tabloya referans olarak vermiştik.Örneğin, müşteriler tablosundaki MusteriID kolonumuzu Sepetler tablosundaki MusteriID ile bağdaştırarak bir alışveriş sepetinin yalnızca bir müşteriye ait olabileceğini veritabanında kurgulamıştık.
Bağlı tablolar arasında veri girişini öğrendiğimize göre şimdide bağlı tablolardaki verileri listelemeyi öğreneceğiz.Bu işlem için SQL Select sorgusunu kullanacağız ve ayriyeten Join (birleştir) deyimini öğreneceğiz.
SQL Join yapısıın syntaxı ise:
Select * from Tablo1
JOIN_TİPİ join Tablo2 on Tablo1.Ortak_Kolon=Tablo2.Ortak_Kolon
ya da
Select Tablo1_HerhangiKolon,Tablo1_HerhangiKolon2,Tablo2_HerhangiKolon... from Tablo1
JOIN_TİPİ join Tablo2 on Tablo1.Ortak_Kolon=Tablo2.Ortak_Kolon
şeklindedir.Bağlı tablolardaki tüm kolonları listelemek yerine yıldız karakteri yerine bağladığımız tabloların adını yazdıktan sonra nokta işaretinden sonra istediğimiz kolonların listelemesini sağlayabiliriz.
SQL Join kavramı ile yukarıdaki bahsettiğim bağlı tablolar arasındaki verileri birbirleriyle birleştirerek tek bir görüntüde listelememizi sağlar.Verilerden bir ya da birkaçının boş (null) kolona sahip olabileceği için 7 farklı join tipi mevcuttur:
Yukarıdaki görselde 7 farklı join tipi gösterilmiş ve her küme bir SQL tablosunu temsil etmektedir ancak join ile ilgili gördüğünüz gibi yalnızca iki tabloyu değil,sonsuz sayıdaki birbirlerine bağlı tablolardaki verileri ilişkilendirebilme şansına sahibiz.
Görselde yer alan her join tipini bu makale dizimizde ayrı ayrı öğreneceğiz,tabi bugünkü konumuz SQL Inner Join olacak.
Inner join (içine bağla) her iki tabloda ortak yer alan bilginin boş (null) geçilmediği durumlarda çalışmakta ve verileri birbirleriyle eşleştirmektedir.
Buraya kadar henüz örnek vermediğimiz için bahsettiklerimden herhangi birşey anlamamış olabilirsiniz,önemli değil nasıl olsa birazdan yapacağımız örneklerle kafanızda hayal meyal birşeyler canlanacaktır :)
Şimdi SQL Server Management Studio uygulamamızı açarak örnek veritabanımız olan BakkalDB veritabanımıza bağlanıyoruz ve veritabanımızdaki tabloların ilişkilerini bir kez daha görelim:
Örnek olarak Kategoriler ve Alt Kategoriler tablosunu ele alalım:
Her iki tablo arasındaki ilişkiye bakarsak ortak kolonlar olarak KategoriID kolonu olduğunu görebiliyoruz,o halde inner join sorgumuzda ortak kolonumuzu KategoriID olarak belirtiyoruz:
Karşımızda ise hem Kategoriler hem de Alt Kategoriler tablolarına ait kolonları ve içerisindeki verileri listeli halde görüyoruz,burada dikkat etmemiz gereken her satır her iki tablodaki kolonların ortak bağlantı noktasına göre getirilmiştir.
Anlaşılması kolay olsun diye şöyle diyebiliriz:
Alt kategori adı "Bisküvi" olan veri, aslında Kategoriler tablosunun "Hazır Gıda" kategorisinin alt kategorisidir...
Bu demek oluyor ki "Bisküvi" alt kategorisi "Sebze" Kategorisinin ya da farklı bir kategorinin alt kategorisi değildir.
Şimdi ise yıldız karakterini kaldıralım ve her kategorinin alt kategori listesini getirelim:
SQL join sorgularında genellikle yıldız karakteri ile verilerin çağrılması pek kullanılmaz çünkü birden çok tablonun her kolonuna ait verileri yığın bir şekilde kullanmak hem performans olarak etkiliyor hem de verilerin çok fazla olması anlaşılması zor bir veri analizine sebep olmaktadır.O yüzden az ve öz verileri listelemekte fayda var.
Join sorgumuzu ilerletelim ve şimdi de ürünler tablomuzu sorgumuza dahil edelim:
Dikkat ederseniz Ürünler tablosunu sorgumuza dahil edebilmek için AltKategoriID kolonunu kullandık,bunun sebebi Ürünler tablosunun şu an ki join sorgumuzda kullandığımız AltKategoriler tablosuyla bir bağlantısı vardı,hatta veritabanı tablo yapımıza tekrar bakarsanız aradaki bağlantıyı görebilirsiniz.
Örnekleri devam ettirmek istersek diğer tabloları da tıpkı bu şekilde aralarındaki ilişkiye göre birbirine bağlayabilir ve istediğimiz bağlı verileri listelemeye devam edebiliriz ancak bunun yerine where deyimini kullanarak daha önce öğrendiğimiz SQL koşul ifadesini join sorgusunda nasıl kullanabiliriz görelim istiyorum.
Inner join sorgumuzun son haline göre kategori adı "Hazır Gıda" olan kayıtları listeleyelim:
Where koşulu olarak kategorinin adı yerine o kategorinin ID değerini kullanarak filtreleme yapabilirdik ancak bu kez ID değerlerine göre değil isim değerlerine göre sorgulama yapalım istedim.
Şimdi ise yine daha önce öğrendiğimiz order by sorgusu ile listemizi ürün adına göre listeyelim:
Elbette SQL sorgularında sınırlamamız yer almıyor ve doğru yazdığımız her durumda verileri çok rahatlıkla listeleme şansına sahibiz.Eğer join sorgusu dışında where ve order by sorgularında kafanız karıştıysa ya bu ilgili iki konudaki makalemi okumadınız ya da tekrar okumanız gerekiyor demektir :)
SQL Inner join konusuyla ilgili olarak anlatacaklarım henüz bu kadarla sınırlandırıyorum,ilerleyen makalelerimizde diğer join tiplerini öğreneceğiz ve bu konulara tekrar tekrar değinmeye devam edeceğiz.
Makalemize son noktayı koyuyor ve bir sonraki makalemizde görüşmek üzere hoşçakalın diyorum :)
Veritabanı derslerimizin en başından beri normalizasyon konusunu öğrenmeye çalışıyor ve bu konuya göre profesyonel bir veritabanı tasarımı ile BakkalDB veritabanımızı geliştirmiştik.
Hatırlarsanız örnek veritabanımızdaki tabloları foreign key anahtarlama sistemi ile aralarındaki ilişkiye göre bağlamıştık:
Tablolar arası ilişkileri gerçekleştirdikten sonra veri girişi için SQL insert sorgusunu öğrenmiş ve bağlı tablolara veri girişlerini gerçekleştirmiştik.Bu sayede bir diğer tablodaki veriyi diğer tabloya referans olarak vermiştik.Örneğin, müşteriler tablosundaki MusteriID kolonumuzu Sepetler tablosundaki MusteriID ile bağdaştırarak bir alışveriş sepetinin yalnızca bir müşteriye ait olabileceğini veritabanında kurgulamıştık.
Bağlı tablolar arasında veri girişini öğrendiğimize göre şimdide bağlı tablolardaki verileri listelemeyi öğreneceğiz.Bu işlem için SQL Select sorgusunu kullanacağız ve ayriyeten Join (birleştir) deyimini öğreneceğiz.
SQL Join yapısıın syntaxı ise:
Select * from Tablo1
JOIN_TİPİ join Tablo2 on Tablo1.Ortak_Kolon=Tablo2.Ortak_Kolon
ya da
Select Tablo1_HerhangiKolon,Tablo1_HerhangiKolon2,Tablo2_HerhangiKolon... from Tablo1
JOIN_TİPİ join Tablo2 on Tablo1.Ortak_Kolon=Tablo2.Ortak_Kolon
şeklindedir.Bağlı tablolardaki tüm kolonları listelemek yerine yıldız karakteri yerine bağladığımız tabloların adını yazdıktan sonra nokta işaretinden sonra istediğimiz kolonların listelemesini sağlayabiliriz.
SQL Join kavramı ile yukarıdaki bahsettiğim bağlı tablolar arasındaki verileri birbirleriyle birleştirerek tek bir görüntüde listelememizi sağlar.Verilerden bir ya da birkaçının boş (null) kolona sahip olabileceği için 7 farklı join tipi mevcuttur:
Yukarıdaki görselde 7 farklı join tipi gösterilmiş ve her küme bir SQL tablosunu temsil etmektedir ancak join ile ilgili gördüğünüz gibi yalnızca iki tabloyu değil,sonsuz sayıdaki birbirlerine bağlı tablolardaki verileri ilişkilendirebilme şansına sahibiz.
Görselde yer alan her join tipini bu makale dizimizde ayrı ayrı öğreneceğiz,tabi bugünkü konumuz SQL Inner Join olacak.
Inner join (içine bağla) her iki tabloda ortak yer alan bilginin boş (null) geçilmediği durumlarda çalışmakta ve verileri birbirleriyle eşleştirmektedir.
Buraya kadar henüz örnek vermediğimiz için bahsettiklerimden herhangi birşey anlamamış olabilirsiniz,önemli değil nasıl olsa birazdan yapacağımız örneklerle kafanızda hayal meyal birşeyler canlanacaktır :)
Şimdi SQL Server Management Studio uygulamamızı açarak örnek veritabanımız olan BakkalDB veritabanımıza bağlanıyoruz ve veritabanımızdaki tabloların ilişkilerini bir kez daha görelim:
Örnek olarak Kategoriler ve Alt Kategoriler tablosunu ele alalım:
Her iki tablo arasındaki ilişkiye bakarsak ortak kolonlar olarak KategoriID kolonu olduğunu görebiliyoruz,o halde inner join sorgumuzda ortak kolonumuzu KategoriID olarak belirtiyoruz:
Karşımızda ise hem Kategoriler hem de Alt Kategoriler tablolarına ait kolonları ve içerisindeki verileri listeli halde görüyoruz,burada dikkat etmemiz gereken her satır her iki tablodaki kolonların ortak bağlantı noktasına göre getirilmiştir.
Anlaşılması kolay olsun diye şöyle diyebiliriz:
Alt kategori adı "Bisküvi" olan veri, aslında Kategoriler tablosunun "Hazır Gıda" kategorisinin alt kategorisidir...
Bu demek oluyor ki "Bisküvi" alt kategorisi "Sebze" Kategorisinin ya da farklı bir kategorinin alt kategorisi değildir.
Şimdi ise yıldız karakterini kaldıralım ve her kategorinin alt kategori listesini getirelim:
SQL join sorgularında genellikle yıldız karakteri ile verilerin çağrılması pek kullanılmaz çünkü birden çok tablonun her kolonuna ait verileri yığın bir şekilde kullanmak hem performans olarak etkiliyor hem de verilerin çok fazla olması anlaşılması zor bir veri analizine sebep olmaktadır.O yüzden az ve öz verileri listelemekte fayda var.
Join sorgumuzu ilerletelim ve şimdi de ürünler tablomuzu sorgumuza dahil edelim:
Dikkat ederseniz Ürünler tablosunu sorgumuza dahil edebilmek için AltKategoriID kolonunu kullandık,bunun sebebi Ürünler tablosunun şu an ki join sorgumuzda kullandığımız AltKategoriler tablosuyla bir bağlantısı vardı,hatta veritabanı tablo yapımıza tekrar bakarsanız aradaki bağlantıyı görebilirsiniz.
Örnekleri devam ettirmek istersek diğer tabloları da tıpkı bu şekilde aralarındaki ilişkiye göre birbirine bağlayabilir ve istediğimiz bağlı verileri listelemeye devam edebiliriz ancak bunun yerine where deyimini kullanarak daha önce öğrendiğimiz SQL koşul ifadesini join sorgusunda nasıl kullanabiliriz görelim istiyorum.
Inner join sorgumuzun son haline göre kategori adı "Hazır Gıda" olan kayıtları listeleyelim:
Where koşulu olarak kategorinin adı yerine o kategorinin ID değerini kullanarak filtreleme yapabilirdik ancak bu kez ID değerlerine göre değil isim değerlerine göre sorgulama yapalım istedim.
Şimdi ise yine daha önce öğrendiğimiz order by sorgusu ile listemizi ürün adına göre listeyelim:
Elbette SQL sorgularında sınırlamamız yer almıyor ve doğru yazdığımız her durumda verileri çok rahatlıkla listeleme şansına sahibiz.Eğer join sorgusu dışında where ve order by sorgularında kafanız karıştıysa ya bu ilgili iki konudaki makalemi okumadınız ya da tekrar okumanız gerekiyor demektir :)
SQL Inner join konusuyla ilgili olarak anlatacaklarım henüz bu kadarla sınırlandırıyorum,ilerleyen makalelerimizde diğer join tiplerini öğreneceğiz ve bu konulara tekrar tekrar değinmeye devam edeceğiz.
Makalemize son noktayı koyuyor ve bir sonraki makalemizde görüşmek üzere hoşçakalın diyorum :)