Jan.01

Inner, Outer, Left, Right, Cross(Full) Join Nedir ?

SQL Sorgulama dilinde birden fazla tabloyu birleştirme yada ilgili başka tablodan veri çekmek için Inner, Outer, Left, Right, Cross Join Segmentleri kullanılır.

Bunlar aşağıda belirtildiği şekilde kullanılır.

Inner Join

Çok basit olarak inner join  bir-e-bir join anlamına gelmektedir. İki tablonuz olduğunu düşünün TabloA da Alan1 adlı bir alanınız var bu alanda A,B,C değerleri var,
TabloB de Alan1 de ise A,B,K değerleri var.

Eğer iki tablo arasında inner join kurarsanız sonuç ta dönecek listede sadece A ve B değerleri olacaktır. Çünkü inner joinde yanlızca eşit olan kayıtlar döner.

SELECT TabloA.Alan1 as TabloAAlan1 , TabloB.Alan1 as TabloBAlan1
FROM TabloA INNER JOIN TabloB
ON TabloA.Alan1 = TabloB.Alan1

--Kodun MSSQL de sade şekli şudur :

SELECT TabloA.Alan1, TabloB.Alan1 as TabloBAlan1
FROM TabloA , TabloB
WHERE TabloA.Alan1 = TabloB.Alan1

--Dönen Sonuç :
--TabloAAlan1 TabloBAlan1
--A A
--B B

Outer Join

Çok basit olarak outer bir-e-çoklu join anlamına gelmektedir (MsSQL Server da çok-a-çoklu join de kurulabilmektedir). İki tablonuz olduğunu düşünün TabloA da Alan1 adlı bir alanınız var bu alanda A,B,C değerleri var, TabloB de Alan1 de ise A,B,K değerleri var.

Eğer iki tablo arasında outer join kuracaksınız ve sizin için TabloA daki tüm kayıtlar TabloB de ise sadece TabloA da bulunanlar gelir.

Left Outer Join

Join kelimesinin sol tarafındaki tabloyu baz alarak eklemek için kullanılır.

SELECT TabloA.Alan1 as TabloAAlan1, TabloB.Alan1 as TabloBAlan1
FROM TabloA LEFT OUTER JOIN TabloB 
ON TabloA.Alan1 = TabloB.Alan1

--Bu kodun MSSQL de sade şekli şudur :

SELECT TabloA.Alan1 as TabloAAlan1, TabloB.Alan1 as TabloBAlan1
FROM TabloA , TabloB
WHERE TabloA.Alan1 *= TabloB.Alan1

--Dönen Sonuç :
--TabloAAlan1 TabloBAlan1
--A A
--B B
--C Null


Right Outer Join

Join kelimesinin sağ tarafındaki tabloyu baz alarak eklemek için kullanılır.

SELECT TabloA.Alan1 as TabloAAlan1, TabloB.Alan1 as TabloBAlan1
FROM TabloA RIGHT OUTER JOIN TabloB 
ON TabloA.Alan1 = TabloB.Alan1

--Bu kodun MSSQL de sade şekli şudur :

SELECT TabloA.Alan1 as TabloAAlan1, TabloB.Alan1 as TabloBAlan1
FROM TabloA , TabloB
WHERE TabloA.Alan1 =* TabloB.Alan1

--Dönen Sonuç :
--TabloAAlan1 TabloBAlan1
--A A
--B B
--Null K

Full Outer Join (MySQL için Cross Outer Join)
Her iki tablodaki tüm verileri getirmek için kullanılır.

SELECT TabloA.Alan1 as TabloAAlan1, TabloB.Alan1 as TabloBAlan1
FROM TabloA FULL OUTER JOIN TabloB 
ON TabloA.Alan1 = TabloB.Alan1

--Bu kodun MSSQL de sade şekli şudur :

SELECT TabloA.Alan1 as TabloAAlan1, TabloB.Alan1 as TabloBAlan1
FROM TabloA , TabloB
WHERE TabloA.Alan1 =* TabloB.Alan1

--Dönen Sonuç :
--TabloAAlan1 TabloBAlan1
--A A
--B B
--Null K
--C Null

Join’ nin sade halinde kullanılan “*” karakteri ise sadece Ms SQL Server’a özeldir. Oracle da ise bu karakter yerine “(+)” işareti kullanılmaktadır ve alan isimlerin sonuna bir boşluk bırakarak yazılır.

Örnek olarak : WHERE TabloA.Alan1 = TabloB.Alan1 (+)

OUTER cümlesi kullanılmasada olur. (Left Join gibi)

Kolay Gelsin.

SQL
Share this Story:
  • facebook
  • twitter
  • gplus

About Muzaffer Ali AKYIL

Merhabalar, Adım Muzaffer Akyıl, Bilgi teknolojileri ile içli dışlı, teknolojiyi yakından takip eden, web ve masaüstü programlama ile uğraşıp, saatlerce kastığı şeyleri hiç bir karşılık beklemeden paylaşmayı amaç eden biriyim.

Yorumlar(13)

  1. Simto Alev
    3524 days önce

    Vu.. Süper makale olmuş.. Aklıma takılan sorunlardan biriydi. Ellerine sağlık…

  2. ilyas TEKER
    3191 days önce

    Full Outer Join arıyordum senin sitene rastladım. Güzel bir makale olmuş. Teşekkür ederim :)

  3. Kendin Yap Akvaryum
    2930 days önce

    Faydalı olmuş, 3 tablonun inner join ile nasıl birleştirileceğini de açıklarsanız güzel olur.

  4. Serçin
    2663 days önce

    Çok güzel anlatıyorsunuz, Ellerinize sağlık,çok teşekkürler…

  5. Muhammed
    2651 days önce

    3 tablonun inner join ile birleştirilmesi
    __________________________________________

    select *
    from tabloA
    INNER JOIN tabloB ON tabloA.Alan1=tabloB.Alan1
    INNER JOIN tabloC ON tabloA.Alan1=tabloC.Alan1

    Şeklinde yapılabilir

  6. drserdar
    2558 days önce

    Şöyle bi sorunum var.

    tablo1
    Columnx
    08:00
    09:00
    10:00
    11:00
    12:00

    tablo2
    columnx columny
    09:00 15.05.2010
    11:00 15.05.2010
    09:00 17.05.2010
    12:00 15.10.2010

    yukardaki iki tabloyu aşağıdaki gibi datagride aktarmak istiyorum.
    1. tablonun tamamını aldım. 2. tablonun da 1. tablo ile ortak satırlarını aldım. ama bu aldıgım satırlarda ayrı bir filtreleme daha yapmalıyım.(mesela aşağıda 15.05.2010 olanları filtreleyerek yazdım )

    datagridview
    clmn1 clmn2
    08:00 null
    09:00 15.05.2010
    10:00 null
    11:00 15.05.2010
    12:00 15.10.2010

  7. muzaffer
    2557 days önce

    Merhabalar drserdar;

    İstediğiniz şeyi şu şekilde yapabilirsiniz.
    [sql]
    SELECT tablo2.* FROM tablo1
    LEFT JOIN tablo2 ON tablo1.columnx = tablo2.columnx AND tablo2.columny = ‘15.05.2010’

    # yada

    SELECT tablo2.* FROM tablo1
    LEFT JOIN tablo2 ON tablo1.columnx = tablo2.columnx
    WHERE tablo2.columny = ‘15.05.2010’
    [/sql]
    kolay gelsin

  8. DrSerdar
    2555 days önce

    muzaffer bey. sorunum ile ilgilenmişsiniz. Tşkler :))

    Visual studio 2008. C# + access veritabanı kullanıyorum

    verdiğiniz kodların üstekini denediğimde (AND li olanı)
    Birleştirme ifadesi desteklenmiyor. hatasını veriyor.

    where li olanı denediğimde ise 2 tablonun keşişimine where uygulamış halde gelıiyor . yani şu şekilde.

    datagridview
    clmn1 clmn2
    09:00 15.05.2010
    11:00 15.05.2010
    12:00 15.10.2010

    benim istediğim. tablo1in tüm satırlarının olması ve tablo2 nin tablo1 le ortak satırlarında bayrı bir filtreleme daha yapmabilmek.

    Yardımcı olursanız çok sevinirim.

  9. DrSerdar
    2554 days önce

    Bu soruma c sharp nedir forumlarında şöyle bir yanıt geldi: Ben nasıl yapılacağını hala çözemedim.
    ————————————————–
    iki tablo içinde kayıt sayısı az olan tablodan where ile data alınırsa doğal olarak iki tablonun kesişimi kadar data gelecektir. Ms-SQL için tam olarak karşılığı nasıl olur bilmiyorum ama ORACLE pl/SQL kodu

    Select * From
    (Select * From Tablo1) T1,
    (Select * From Tablo2 where field1=123) T2
    Where T1.ID = T2.ID(+);

    Sanırım burada kullandığım (+) ifadesinin karşılığı left join sql serverda
    ———————————-

  10. tolga
    2404 days önce

    ellerine sağlık güzel bir paylaşım olmuş.
    Teşekkür ederiz :)

  11. dene
    2300 days önce

    çok teşekkürler iyi olmuş

  12. Trackback: CET482.1 Database Applications Day 4. Part 2 | aligunaydin

  13. Hasan
    193 days önce

    Eline sağlık, güzel makale

Bir yorum bırak

 

Comment