300 likes | 569 Views
Veritabanı Yönetim Sistemleri-I. Ders 3 Birden fazla tabloyu birleştirmek Equi - join INNER JOIN OUTER JOIN. Tabloları birleştirmek. SELECT ile oluşturulmak istenen listede bulunan alanlar birbirinden farklı tablolarda bulunuyorsa, tabloları birleştirerek sorgulamak gerekiyor
E N D
Veritabanı Yönetim Sistemleri-I • Ders 3 • Birden fazla tabloyu birleştirmek • Equi-join • INNER JOIN • OUTER JOIN
Tabloları birleştirmek • SELECT ile oluşturulmak istenen listede bulunan alanlar birbirinden farklı tablolarda bulunuyorsa, tabloları birleştirerek sorgulamak gerekiyor • Birden fazla tabloyu birleştirerek sorgulamak için JOIN ifadesi kullanılır. • Tablo birleştirmenin pek çok türü vardır, önde gelen bazıları şunlardır • INNER JOIN • EQUI-JOIN • OUTER JOIN
Tabloları birleştirmek • Örneğin ürünlerin adlarını, fiyatları, satıcı adlarını ve satıcı şehirlerini yanyana listelemek istersek göreceğiz ki istenen alanlar iki farklı tabloda bulunmaktadır urunlertablosu saticilartablosu
Tabloları birleştirmek • Oluşturulmak istenen liste aşağıdaki gibi olacaktır urunlertablosu saticilartablosu
Tabloları birleştirmek • İki tablodan ilişkili alanları alırken, şu adımlar dikkate alınır • Bahsi geçen tablolar mantıksal olarak ilişkili olmalıdır • İki tablodaki tüm satırlar değil, sadece mantıksal olarak ilişkili satırlar yanyana getirilir • Daha iki tablodaki satırların yanyana getirilmesi sonucu oluşan yeni tablodan istenen alanlar seçilebilir
Tabloları birleştirmek • İki tabloda mantıksal olarak ilişkili satırların birleştirilmesi • Urunler tablosundaki satici_id = ‘DLL01’ olan satır • saticilar tablosundaki satici_id = ‘DLL01’ olan satırla birleştiriliyor
Tablo birleştirme • Benzer şekilde diğer satırlarda ikinci tablodaki ilgili satırlarla birleştiriliyor • BİRLEŞTİRME KURALI • urunler.satici_id = saticilar.satici_id
Tablo birleştirme • Tablo birleştirme sırasında en kolay yol equi-join yazımını kullanmaktadır • Birleştirilecek tablolar virgülle ayrılarak FROM’dan sonra yazılır • Birleştirme şartı (yani hangi satırların yanyana geleceğine dair şart) WHERE ifadesinde yazılır • SELECT ile seçilecek sütunlardan (alanlardan) önce alanın hangi tablodan geleceği yazılır • İstenirse tablo isimleri için kısa adlar (alias) kullanılabilir
Tablo birleştirme • Ürünlerin adlarını, fiyatları, satıcı adlarını ve satıcı şehirlerini yanyana listeleyen SQL sorgusu • Seçilen alanlar“tablo.alan” formatında yazılır • Tablolar virgülle ayrılmış olarak yazılır • Satır birleştirme şartı (her iki tabloda aynı olan değerler) verilir
Tablo birleştirme Tablo isimlerine “alias – kısa ad” vererek sorgu biraz daha sadeleştirilebilir (Ör: saticilar için “s”, urunler için “u” kısa adı kullanılabilir)
Tablo birleştirme • İkinci bir örnek: • Sipariş edilen ürünlerin (sip_edilen), urun_id, sip_num bilgilerini ile urun_ad bilgilerini listeleyiniz (urun ad bilgisi urunler tablosundadır)
Tablo birleştirme Tablo isimler için yine kısa ad kullanılmıştır
Tablo birleştirme • Equi-join ile yapılan işi INNER JOIN ile de yapabiliriz. • Bu JOIN türü yazım olarak biraz farklıdır ama aynı işi yapmaktadır. • İki yazımı kıyaslayalım: Equi-join yazımı SELECT alanlar FROM tablo1, tablo2 WHERE tablo1.alan1 = tablo2.alan2 INNER JOIN yazımı SELECT alanlar FROM tablo1 INNER JOIN tablo 2 ON tablo1.alan1 = tablo2.alan2 “ON” anahtar kelimesi şart belirtmek için kullanılmaktadır
Tablo birleştirme • İlk sorgumuzu INNER JOIN ile yazmış olsaydık, şöyle yazmamız gerekirdi
Tablo birleştirme • Birden fazla tabloyu aynı anda birleştirmek için yazılan ifadeleri her tablo için tekrar etmek gerekir SELECT alanlar FROM tablo1 INNER JOIN tablo 2 ON tablo1.alan1 = tablo2.alan2 INNER JOIN tablo3 ON tablo3.alan3 = tablo2.alan2 INNER JOIN tablo4 ON tablo4.alan4 = tablo3.alan3 …….
Tablo birleştirme • Örneğin şu aşağıdaki alanlari içeren liste isteniyor olsun: • Her bir sipariş edilen ürünün sipariş numarasını ve urun_id bilgisini (sip_edilen tablosundan) • Siparişin tarihini (siparisler tablosundan), • Siparişi veren müşterinin adını (musteriler tablosundan)
Tablo birleştime • Aynı sorgu Equi-Join ile şöyle yazılabilirdi • Tüm birleştirme şartları “AND” ile yanyana yazılır • Tüm tablolar virgülle ayrılarak yanyana yazılırlar
Tablo birleştirme • OUTER JOIN • Bazen birleştirilecek iki tabloda birinci tabloda bulunan satırın, ikinci tabloda bir eşleşmesi olmayabilir. • Bu durumda INNER JOIN ve EQUI-JOIN sorgularında, ikinci tabloda eşleşmesi bulunmayan satırlar sorgu dışında bırakılırlar • Ör: Satici_id değeri, satıcılar tablosunda bir satıcıya işaret etmeyen ürün satırları gibi
Tablo birleştirme • OUTER JOIN (devam) • Eğer birinci tablodaki tüm satırlar eşleşme olmamasına rağmen listeye eklensin ve eşleşme satırı boş bırakılsın isteniyorsa OUTER JOIN kullanılır • Birinci tablodaki satır baz alınarak eşleşme yapılacaksa LEFT OUTER JOIN • İkinci tablodaki satır baz alınarak eşleşme yapılacaksa RIGHT OUTER JOIN kullanılır
Tablo birleştirme • Örneğin siparişler ve müşteriler tablolarını incelersek: • Her siparişin bir müşteriye ait olduğunu, yani siparişler tablosundaki her sip_id’ninmusteriler tablosunda bir must_id’e denk geldiğini • Fakat her müşterinin bir sipariş vermemesinden dolayı, musteriler tablosundaki her must_id’nin , siparisler tablosundaki bir sip_id’e denk gelmediğini görürür
Tablo birleştirme • Tüm siparişler herhangi bir müşteri ile ilişkili • Fakat tüm müşterilerin en az bir siparişi bulunmamaktadır (Ör: 1000000002 nolu müşteri)
Tablo birleştirme • Dolayısıyla INNER JOIN veya EQUI-JOIN ile yapılan tüm sorgularda 10000004 nolu müşteri her zaman liste dışında kalacaktır (sipariş kaydı olmadığı için) • Eğer bu müşteriyi de listeye dahil etmek istiyorsak LEFT OUTER JOIN kullanmamız gerekir • Bu durumda bu müşterinin sipariş kaydının karşısında NULL ifadeler olacaktır (siparişi olmadığını gösterir)
Tablo birleştirme • 100000001 kodlu müşteriye ait 2 satır olduğuna • 100000004 kodlu müşterinin karşısındaki değerlerin NULL olduğuna dikkat ediniz
Tablo birleştirme • Aynı sorgu INNER JOIN ile yazılsaydı (sadece INNER yerine LEFT OUTER yazmak yeterli) satır sayısı bir tane azalacaktı.
Tablo birleştirme • Alternatif olarak listeyi sadece bu müşteriyi listeleyecek şekilde, yani hiç siparişi olmayan müşterileri gösterecek şekilde, tekrar da yazabiliriz
Tablo birleştirme • JOIN ve GROUP BY kullanımı • Tablo birleştirme sonrasında ortaya çıkan geçici tablodan istenilen alan seçilebildiği gibi diğer SQL işlemleri de yapılabilir • Örneğin tablolar birleştikten sonra birleşen yeni tablo üzerinde gruplama (GROUP BY), sıralama (ORDER BY) veya filtreleme (WHERE) kullanılabilir • Normal bir tablodaki sorgulara göre tek fark, alanları WHERE, GROUP BY, ORDER BY içinde yazarken, tablo adı ile birlikte yazmak gerekir (tablo.alan formatında)
Tablo birleştirme • Örneğin aşağıdaki sorgu, tablo birleştirme yapmadan normal bir gruplama işlemini içermektedir • Peki ya gruplamayı satici_id yerine satici_ad alanına göre yapmak istersek? • (Bu alan urunler tablosunda değil, saticilar tablosundadır)
Tablo birleştirme • Bu durumda önce iki tablo birleştirilir, daha sonra iki tablodaki alanlara göre gruplama tekrar yazılır