Join Islemi – Outer Join (Left Outer Join, Right Outer Join ve Full Outer Join)

Giris

Birinci makalemizde join islemlerine giris yapmistik. Join isleminin avantajlari ve dezavantajlari hakkinda konusmustuk. Birbiri ile iliskili tablolardan olusan bir veritabaninin tek ve büyük bir tablo yapisi ile kurulmus bir veritabanindan daha performansli ve islevsel oldugundan bahsetmistik. Ayrica birbiri ile iliskili tablolardan tek bir sorgu ile birlesik veri çekmek için join islemi kullanmamiz gerektigini daha önceki makalemizde anlattik. Önceki makalemize buradan erisebilirsiniz.  Bu makalemizde önceki makalemizde olusturdugumuz veritabanini kullanacagiz.

.

                Veritabani yapimiz yukaridaki diyagramda gösterilmistir. Tablolara istediginiz verileri kendiniz ekleyin.

                Join isleminde tablolari baglamak için integer veya bir uniqueidentifier veri tipindeki alanlara ihtiyacimiz yok. Istersen varchar tipinde Ad alanini da kullanarak Join islemini yapabiliriz. Ayrica Joinde bagladigimizi alanlarin primary veya Foreign Key de olmasi sart degil. Fakat integer veya Key alanlarin birbiri ile baglanmasi sonucu olusturulan Join islemleri daha performansli çalistigini da söylemek gerekir. Çok büyük verilerin bulundugu tablolarda bu önemli bir noktadir.

Önceki makalemizde iner join kullanarak siparis vermis olan müsterilerimizi ve siparis bilgilerini tek bir satir halinde göstermistik, inner Join hakkinda bilgi vermistik siradaki örnegimizde left outer join kullanarak siparis versin vermesin tüm müsterilerimizi ve siparis vermis olanlarin siparis bilgilerini listeleyecegiz.

.

LEFT OUTER JOIN

Inner Join de iliskilendirilen iki tablonun her ikisinde de uyusan kayitlar getirilirdi. Outer joinde ise tablolardan birinde olan tüm kayitlar ve ikinci tabloda bu kayitlarla iliski olanlar getirilir. Ikinci tabloda iliskili bir kayit yoksa birinci tablodaki veriler yinede getirilir. Bu örnekte siparis versin vermesin tüm müsterilerimizi ve siparis bilgileri varsa ayrica bu bilgileri gösterecegiz.

select m.Ad,m.Soyad,m.Adres,s.SiparisNo from  Musteri  m left outer join   Siparis s   on m.MusteriKey = s.MusteriKey

Yukaridaki sorguya dikkat ederseniz fromdan sonra Musteri tablosu var left outer join ifadesinden sonrada Siparis tablosu var. Bu dizilim müsteri tablosundaki her kayit için uyusan siparis bilgilerini getir. Eger uyusan yoksa müsteriyi yinede göster anlamina gelir. Eger müsteri ve siparis tablolarini yer degistirirseniz her siparis için müsteri bilgilerini getir, siparis veren müsteri bilgisi olmasa bile siparis bilgisini göster anlamina gelir. Yani buradaki tablolarin kullanim sirasi çok önemlidir.

Ad

Soyad

Adres

SiparisNo

Seher

KUNT

Dikmen/Ankara

123456

Seher

KUNT

Dikmen/Ankara

123456

Seher

KUNT

Dikmen/Ankara

123456

Mehmet Sabri

KUNT

Dikmen/Ankara

123

Metin

TOSUN

Balgat/Ankara

NULL

 

Yukaridaki sorgu sonucu gelen kayitlar yukaridaki gibidir.  Dikkat ederseniz Metin Tosuna ait bir siparis bilgisi olmamasina ragmen Metin Tosun adli müsteri listede yer almistir. Inner Join ile outer joinin en önemli farki burasidir. Inner join için önceki makalemize bakiniz.

Birden fazla tablodan kayit çekerken dikkat etmemiz gereken noktalardan biriside her iki tabloda da ayni isimle bulunan kolonlari listede göstermek istedigimizde hangi tablodaki kolonu göstermek istedigimizi belirtmek zorunda olmamizdir. Örnegin;

select m.Ad,m.Soyad,m.Adres,s.SiparisNo,MusteriKey from  Musteri  m left outer join   Siparis s   on m.MusteriKey = s.MusteriKey

Yukaridaki sorguya dikkat ederseniz MusteriKey kolonu select ifadesine eklenmistir. Bu sorguyu çalistirdigimizda SQL Server bize asagidaki hayati verir.

Msg 209, Level 16, State 1, Line 1

Ambiguous column name ‘MusteriKey’.

 

Bu hatanin sebebi MusteriKey kolonunun hem Musteri tablosunda hem de Siparis tablosunda bulunmasidir. SQL Server hangi tablodaki kolona ait bilgileri gösterecegini bilemedigi için size yukaridaki hatayi verir. Hatani çözümü ise çok basittir. Sadece kolonun önüne tablonun adini yazmak yeterlidir. Biz sorgumuzda Musteri tablosunu m ile ifade ettigimiz için m.MusteriKey yazmamiz sorgunun çalismasina için yeterli olacaktir.

RIGHT OUTER JOIN

                Right outer join tüm islevselligi ile Left outer join ile aynidir. Aralarindaki tek fark sola yazilan tablodaki tüm veriler degil saga yazilan tablodaki tüm veriler listelenir.

Yukardai yazdigimiz siparis bilgisi olan veya olmayan tüm müsteriler ve olanlarin siparis bilgilerini de getirdigimiz sorgunun right outer join ile yazilmis hali ise söyledir;

select m.Ad,m.Soyad,m.Adres,s.SiparisNo from   Siparis s right outer join Musteri  m  on m.MusteriKey = s.MusteriKey

Sorgunun sonucu asagidaki gibidir.

Ad

Soyad

Adres

SiparisNo

Seher

KUNT

Dikmen/Ankara

123456

Seher

KUNT

Dikmen/Ankara

123456

Seher

KUNT

Dikmen/Ankara

123456

Mehmet Sabri

KUNT

Dikmen/Ankara

123

Metin

TOSUN

Balgat/Ankara

NULL

 

FULL OUTER JOIN

Son outer join tipi olan full outer join ise join isleminde birbirine baglanan her iki tabloda bulunan kayitlari da getirir. Yani hem müsteri tablosunda siparis veren ve vermeyen, hem de siparis tablosunda müsteri bilgisi olan ya da olmayan kayitlari listelemek istersek;

.

select m.Ad,m.Soyad,m.Adres,s.SiparisNo from  Musteri  m full outer join   Siparis s   on m.MusteriKey = s.MusteriKey

Ad

Soyad

Adres

SiparisNo

Seher

KUNT

Dikmen/Ankara

123456

Seher

KUNT

Dikmen/Ankara

123456

Seher

KUNT

Dikmen/Ankara

123456

Mehmet Sabri

KUNT

Dikmen/Ankara

123

Metin

TOSUN

Balgat/Ankara

NULL

NULL

NULL

NULL

123456

 

Sorgu sonucuna dikkat ederseniz Müsteri bilgisi olmadigi halde siparis tablosundaki kayitlar ve siparis bilgisi olmadigi halde müsteri tablosundaki kayitlar dahil tüm veriler listelendi.

Bu makalemizde Outer Join hakkinda bilgi vermeye çalistim. Bir sonraki makalemizde görüsmek üzere.

22 thoughts on “Join Islemi – Outer Join (Left Outer Join, Right Outer Join ve Full Outer Join)

  1. FULL OUTER JOIN bunu kolonların hepsinin ismini tek tek yazmaktansa tablo isimlerini yazsak olur değilmi

  2. RIGHT OUTER JOIN

    Right outer join tüm islevselligi ile Left outer join ile aynidir. Aralarindaki tek fark sola yazilan tablodaki tüm veriler degil saga yazilan tablodaki tüm veriler listelenir.

    Yukardai yazdigimiz siparis bilgisi olan veya olmayan tüm müsteriler ve olanlarin siparis bilgilerini de getirdigimiz sorgunun right outer join ile yazilmis hali ise söyledir;

    yazım hattası var kötülemek için değil gayet faydalı bir sayfa sadece takıntılıyım

  3. Utkan merhaba
    right outer joindeki veri dogrudur. right outer dedygymyz ycyn her zaman mustery tablosundaky veryler gelecek. bu yuzden son kayytta mustery bylgylery gelyrken, syparys verylery gelmemys.

  4. Right outer join de kullandy?ynyz veri sanyrym kary?my?, left outher joindekiyle. sonuç en son eleman için 

    NULL

    NULL

    NULL

    123456

    ?eklinde olmalyydy
  5.  

    Elinize saglik, çok anlasilir ve faydali bir anlatim olmus, nihayet anladim olayi 🙂 Tesekkürler.

  6. metin harcama yapmamis çünkü araba almak için para biriktiriyordu. bu hafta arabayi alacagina göre bundan sonra bolca harcama yapacaktir. kredi karti ektresinden petrol eksik olmayacak artik. 

    en çok harcamayi yapan kisi ise istatistiklere göre baycan çikti. 

  7. Acaba Metin TOSUN neden siparis vermemis ve en çok harcamayi yapan kisi sorgusunu rica etsem yardimci olurmsunuz . 

  8. Anlatim çok güzel, çok okunakli, çok sade olmus. Emeginizi tebrik eder, çok tesekkür ederim. Çalismalarinizda Basarilar dilerim.

  9. Makaledeki amaç mantigi anlatabilmekti. kendi veritabaninizda örnek datalarla deneme yaparsaniz daha anlasilir olacaktir

  10. tabla yapisni vermisiniz ama verileri de verseydiniz sorgu sonucunda ne tür bir degisiklik oldugunu daha net anlayabilirdik.

  11. eger sadece 2 tablon var. a da olup b de olmayanlari alacaksan. asagidaki sorguda ayni göervi yapar

    select * tablo1 a where a.id not in (select id from tablo2)
     

  12. istedigini dogru anladiysam asagidaki gibi bir sorgu isini görür kardes.

    select * from tablo1 a
    where a.id not in
    (
    select id
        from tablo1 b
        inner join tablo2 c on b.id = c.id
    )

  13. hocam peki biz

     

    2 tablodaki benzer sutunlari eslestirip sadece 1 tablodan benzer olmayan verileri nasil listeleriz? yardimci olursaniz sevinirim..

     

    saygilarimla…

  14. internetten gordugum left ve right joini anlatan en ozet en anlasilir ve en guzel makale olmus tesekkurler

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir