TSQL Join islemlerinin Mantigi – Inner join ve Outer join Kullanimlari

SQL de join islemlerini daha önceki makalelerimizde anlatmistik. Bu seferki makalemde join islemini resimlerle daha anlasilir hale getirmeye çalisacagim.

Join ile ilgili önceki makalelerimiz:

  • Makale 1 :  Join Islemi – Inner Join
  • Makele 2 :  Join Islemi – Outer Join (Left Outer Join, Right Outer Join ve Full Outer Join)

Önceki makalelerde bahsettigimiz gibi join islemi iki veya daha fazla tablodan veri getirme islemi için kullanilir. Veritabanimiz daki her bir tabloyu matematik dersinde gördügümüz kümelere benzetmek yanlis olmaz. Kümeler üzerinde kesisim, birlesim, fark gibi islemleri hatirliyoruzdur. Join islemlerini de matematikteki bu ifadelerle anlatmanin daha anlasilir olacagini düsünüyorum.

INNER JOIN

Inner join her tabloda da ayni olan kayitlari verir. SQL de varsayilan join sekli inner joindir.

select * from Tablo1 t1
inner join Tablo2 t2 on t1.kol1 = t2.kol1

sql server inner join

Resimde gördügümüz gibi iner join iki kümenin kesisimini verir. Küme sayisi ikiden büyük olabilir.

OUTER JOIN

Outer join iki tablodaki iliskili olmayan kayitlari da döndürmemizi saglar. Outer join isleminin 3 farkli çesidi vardir.

Left Outer Join

select * from Tablo1 t1
left outer Tablo2 t2 on t1.kol1 = t2.kol1

Birinci tablodaki tüm kayitlar getirilir, buna karsin ikinci tabloda bu kayitlarla uyusan kayitlarda gelir.

sql server left outer join

.

Right Outer Join

Ikinci tablodaki tüm kayitlar getirilir, buna karsin birinci tabloda bu kayitlarla uyusan kayitlarda gelir.

select * from Tablo1 t1
right outer Tablo2 t2 on t1.kol1 = t2.kol1

sql server right outer join

Full Outer Join

Full outer joinde iki tablodaki tüm kayitlar uyussun yada uyusmasin getirilir.

select * from Tablo1 t1
full outer Tablo2 t2 on t1.kol1 = t2.kol1

Ek bilgiler

Outer join kullanarak kolayca yapabilecegiz bazi yöntemleri burada anlatacagim.

a – Iki tablomuz var ve biz birinci tablonun ikinci tablodan farkini almak istiyoruz, yani birinci tabloda olan ama ikinci tabloda olmayan kayitlari alacagiz.

Bunu iki sekilde yapabiliriz.

SELECT  t1.*
FROM Table1 t1
WHERE t1.ID NOT IN (SELECT t2.ID FROM Table2 t2)

Yukaridaki klasik sorgu kullanimi yerine ayni islemi asagidaki gibi left join ilede yapabiliriz.

SELECT t1.*,t2.*
FROM Table1 t1
LEFT OUTER JOIN Table2 t2 ON t1.ID = t2.ID
WHERE t2.ID IS NULL

Left outer join ile yazdigimiz sorgunun ilk sorguya göre çok daha hizli çalisacagina emin olabilirsiniz.

sql server left outer join with where

Yukaridaki resmi incelersek yazdigimiz sorgunu Tablo1 fark Tablo2 aldigini kolayca görebiliriz.


b – Inner join ile iki kümenin kesisen kismini aldigimiz söylemistik peki iki kümenin kesisen kismi disinda kalan kismi nasil alabiliriz.

SELECT t1.*,t2.*
FROM Table1 t1
FULL OUTER JOIN Table2 t2 ON t1.ID = t2.ID
WHERE t1.ID is NULL or t2.ID IS NULL
.

Sorgu sonucunca asagidaki resimde gösterildigi gibi sonuç döner.

sql server full outer join

Umarim join isleminin mantigini kafanizda oturtmanizda yardimci olabilmisimdir.

45 thoughts on “TSQL Join islemlerinin Mantigi – Inner join ve Outer join Kullanimlari

  1.  çunku hosting firmalari mssql destekleyen paketlerini pahaliya veriyorlar ve cok az bir alan veriyorlar. ayrica mssql için islemci ve ram kisitini abartiyorlar. buda sorunlara yol aciyor. 

  2.  kavga etmeyin arkadaslar 🙂

    betül hanim, oracle tabiki maliyetlidir. ben projenin büyüklügü ve amacina göre farkli sistemler seçmelisin dyorum. Büyük veriler ve çok fazla transaction gerekli ise SQL Server veya Oracle seçmelisin, tabiki teradata, exadata vb alternatiflerde var. ama genel olarak piyasada sql server veya oracle kullanilir. maliyetten kaçanlar genelde sql servera yönelir. Biz yaklasik 20 tb veriyi sql server 2008 r2 da tutuyor ve yönetiyoruz, o yuzden oracle veya  sql server ikiside olur. ama su bir gerçekki, piyasada oracle ci olmak sql ci olmaktan malesef daha degerli.

    sen projen hakkinda biraz bahsedersen hangi veritabanini kullanman gerektigi hakkinda konusabiliriz.

    mesela ben bu sitede sql server kullaniyorum. ama son zamanlar mysql kullanmadigima pisman oldum, çunku hosting firmalari mssql destekleyen paketlerini pahaliya veriyorlar ve co

  3. Gezgin ‘ bu isi bn 8 senedir yapiyorumm  espiri yapmaya çalistiysan ‘ güLüym boSa gitmesin  faceni ver ‘ ordan anlat derdini ‘ özeLe geL 😀

  4.  madem bu kadar biliyosun neden mssql mi yoksa mysql mi diye soruyosun betül hanim ?

  5.  veritabanini ne amaçla kullanacagin ve ne kadar boyutta bir veri tutacagina göre degisir. eger bir web sitesi yapacaksan ve ziyaretçi sayisi az olacak ise access kullanabilirsin. fazla ise ama ucuz bir hosting bulmak istiyorsan mysql daha avantajli olur.

    Eger bir windows app yazacaksan yine kriterlerine göre bunlardan birini seçebilirsin. fakat proje yaparken kendinide veritabaninda gelistirmek istiyorsan, yarin is hayatinda lazim olacak bir veritabani seçmen senin için daha iyi. bu yüzden sql sever veya oracle seçmeni tavsiye ederim

  6. SELECT Kisiler.adi, Kisiler.soyadi, Telefon.telefonNo, TelefonTuru.adi, Eposta.adi
    FROM (TelefonTuru INNER JOIN (Kisiler INNER JOIN Telefon ON Kisiler.id = Telefon.kisiId) ON TelefonTuru.id = Telefon.telefonTuruId) INNER JOIN Eposta ON Kisiler.id = Eposta.kisiId;
     

  7. ya bisey sorcam veri tabanimiçin Mssql mi kullansam yoksa mysqL çok kararsizim 🙁

  8. bu sorgu tum kategorileri getirir yanlarina urun varsa onlari getirir.

    onceki sorgu ise tersini yapiyordu.  biz demekki yanlis anlasmisiz 🙂

  9. sorun sql cümlesindeymis bazi düzenlemeler yaptim düzeldi 

    SELECT *, kategori.baslik AS kat_baslik, 

    kategori.icerik AS kat_icerik 

    FROM kategori LEFT JOIN urun ON kategori.id=urun.ana_id AND 

    kategori.lisan="’.ayarlar::L_ID.’" where kategori.id="’.$_GET[‘id’].’"

    su sekilde düzenledim

  10.  gerekli olan kisima suradan bakabilirsen eger 

    liste2() fonksiyonu

    kategorilerde ürün varsa getiriyor ürün yoksa kategori baslik ve içerigini bos basiyor

    mesela orada ürünlere ait test kategorisinin ürün tablosunda kaydi yok ona bakarak anlasilir

    liste fonksiyonu düzgün çalisiyor dogru çalisan diye üstte gösterdim

     

  11. sorunu çözduyseniz problem yok. ama bir yerde yanlis anliyorum ben sanirim. istersen sen bana iki tablonun create ve insert scriptlerini gönder. almak istedigin bilgiyide tam olarak yaz ben deneyeyim.

  12. kodu denedim dedigim gibi çalismiyor, dün geceden beri ugrasiyorum union, full ile ilgili 100 200 tane filan örnek denedim olmadi mecburen iki farkli sorgu ve döngü kullanarak yaptim çok tesekkürler MSK vaktinizi aldim

     

  13. sorgunda bos gelmesi normal. where kriterinde bos gelenleri eliyorsun cunku

    SELECT *, kategori.baslik AS ana_baslik,
    kategori.icerik AS ana_icerik
    FROM urun
    left outer join kategori ON urun.ana_id=kategori.id and kategori.id = $yy$
    where urun.lisan=$xx$

    seklinde yaz

     

  14. herhalde ben yanlis yapiyorum a tablosu 2. idi gelmedi bos basiyor

    kategori tablosu

    ->id<- alt_id baslik icerik lisan

    urun tablosu

    id ->ana_id<- baslik icerik dosya etiket tarih

  15.  SELECT *, kategori.baslik AS ana_baslik, 

    kategori.icerik AS ana_icerik 
    FROM kategori RIGHT JOIN urun ON urun.ana_id=kategori.id 
    where urun.lisan="’.ayarlar::L_ID.’" and kategori.id="’.$_GET[‘id’].’"
     
    buradaki kategori tablosu id ile urun tablosu ana_id eslesmedigi zaman kategori tablosunun idi gelmiyor
  16. ahmet merhaba

    a tablosunu left outer joinle b tablosuna baglarsan a daki 1 ve 2 gelir. ayrica b deki 1 de gelir..

    sen sonuc olarak almak istedigin tabloyuda yazarsan onun sorgusunu yazayim ben sana

  17. soruyu düzenledim tekrar gönderdim spam yapiyormusum gibi oldu ama kusura bakmayin textarea da karakter sinirlamasi var sanirim o fazla mesajlari siliverirseniz sevinirim iyi çalismalar

  18. full outer joinle veri almam gerekli asagidaki a tablosunun 2 nolu id in karsiligi eslesmedigi için 2 nolu idi left ve right joinle hiç basmiyor o yüzden full outer join kullanmam gerek yukaridaki kod ve baska kodlar da denedim çalismiyor mysql 5.5  versiyonla ilgisi olabilirmi yada asagidaki tabloya göre düzenlenmis örnek sql cümlesini yazabilirmisiniz

    a tablosu

    id baslik icerik

    1    a            b

    2    c            d

    b tablosu

    id baslik icerik

    1    a            b

    null

        

  19. benim söyle bir sorunum var ama yardimci olabilirseniz sevinirim

    a tablosu                              b tablosu
     
    id      baslik    icerik           id        baslik      icerik
    __ + _____+ _____        ___+_______+______
    1          a            b                 1           b                 c
    2          d            e                 2           f                  g
    3       &nbs
  20. 1. tablona t1 2 tablona t2 takma adini ver, yani, spnra t1.id_baslik ve t2.id_baslik oalrak kullan

    yani,

    select t1.idbaslik as id_baslik_1, t2.id_baslik as idbaslik_2 from tablo1 as t1,tablo2 as t2

  21. tesekkürler çok faydali bir yazi fakat  benim bir sorum var

    farkli iki tabloda ayni isme sahip sutun var bunlari birbirinden ayiramadim

    a tablosu  id   baslik  b tablosu a_id baslik

    bu iki ayni sutunu birbirinden ayirip nasil alabilirim yani bir çok sekil denedim fakat ya a tablosundaki basligi aliyorum yada b tablosunun basligini ikisini ayni anda alamiyorum

  22. Valla eyvallah dostum ellerine saglik tek seferde anladim.Gayet sade ve anlasilir olmus eline koluna saglik…

  23. Gece kod yazarken bir noktada takili kaldim. Ve sikinti basti biraktim gitttim. Ama ne çare.. Bu sefer uyku tutmadi.. Sabri abinin bu makalesi yetisti imdadima.. Tesekkürler Abi

  24. bu durumda önce bir join yapip ilk iki tablonu baglayacaksin sonra ardindan 3. tabloyu yine join ile baglayacasin.

    select * from Tablo1

    left join Tablo2 on tablo1.X = Tablo2.X

    left join Tablo3 on tablo2.Y = Tablo3.Y

     

    gibi

     

  25. Sabri abi yine her zaman ki gibi çok güzel anlatmissin, çok tesekkür ederim.

    Bir sorum var:

    Left ve Right Outer Join islemleri birinci ve ikinci tablodaki kayitlari getiriyordu. bu iki tane tablo bulunan bir veritabaninda kullaniliyor.

    Peki ya benim 2 den fazla tablom varsa ne olcak ? 🙂 

  26. Çok tesekkür ederim.

    karmasa yasadigim bir konu çok iyi bir sekilde kafamda çözüldü. 

  27. gürkan bey mantik olarak zorlandigim bir konuydu çok açik anlatmissiniz çok tesekkürler 

Bir cevap yazın

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