61  SQL Birleştirme (JOIN)

Birden fazla tabloyu JOIN ile sorgulama Konular

  • Join-Birleşim Kavramı
  • Join-Birleşim Söz dizimi
  • Inner Join - İç Birleşim
  • Outer Join - Dış Birleşim
    • Right outer join
    • Left outer join
    • Full outer join
  • Cross Join - Çapraz Birleşim
  • Self Join - Kendi ile Birleşim

61.1 Birleştirme (JOIN) Kavramı

  • Birden fazla tablodaki satırları verilen kritere göre birleştirir.
  • Genellikle ana anahtar (primary key) ve yabancı anahtar (foreign key) birleştirmesi yapılır.
  • Örneğin Öğrenci ve İletişim tablosu birleştirilir.
  • birleştirme işlemini Venn diagram olarak düşünmek iyi olur.
  • Ama aslında, bu bir küme işlemi değildir

join-inner-example1-tr

Aşağıda iç birleştirme (inner join) için aşağıda başka bir örnek resim görebilirsiniz.

iç birleştirme (inner join)

Yukarıdaki örnekte X ve Y tablolarındaki aynı anahtar değerleri (1 ve 2) birleştirilir. Ama X tablosundaki 3 anahtar değeri ve Y tablosundaki 4 anahtar değeri 2 tabloda birden aynı olmadığı için iç birleştirme sonucuna getirilmemiştir.

Birleştirme işlemi ilişkisel veri tabanlarındaki en önemli işlemlerden biridir. İlişkili tablolardaki bilgiler birleştirme (join) işlemi yapılarak gösterilir.

61.2 JOIN Birleştirme Söz Dizimi

ANSI-SQL-89 kullanımı

SELECT ...
FROM   Table1, Table2
WHERE  Table1.KolonA = Table2.KolonA;

ANSI-SQL-92 kullanımı

SELECT ...
FROM   Table1 JOIN Table2
ON  Table1.KolonA = Table2.KolonA;

Bu iki kullanım arasında her zaman ikinci, SQL-92 kullanımı tercih edilmelidir.

61.3 İç Birleştirme (Inner Join)

join-inner-example1-tr
  • Her iki tabloda eşleşmiş olan kayıtları getirir.
  • Örneğin bir öğrencinin iletişim bilgisi yoksa, o öğrencinin bilgileri gelmez.
  • Eşleşme ON kelimesinde verilen kolonlara göre yapılır. Birden fazla kolon birleştirilebilir.
  • Eğer birleştirme = ile yapılıyorsa, eşitlik birleştirme (equi-join) diye de adlandırılır.
SELECT OgrenciNo,IletisimTipi,IletisimDegeri
FROM   OGRENCI INNER JOIN ILETISIM
ON  OGRENCI.OgrenciKey = ILETISIM.OgrenciKey;

join-inner-example1-tr

Yukarıdaki örnekte X ve Y tablolarındaki aynı anahtar değerleri (1 ve 2) birleştirilir. Ama X tablosundaki 3 anahtar değeri ve Y tablosundaki 4 anahtar değeri 2 tabloda birden aynı olmadığı için iç birleştirme sonucuna getirilmemiştir.

ANSI-SQL-92 birleştirmelerinin doğru söz dizimi aşağıdaki söz dizimidir.

SELECT ...
FROM   Table1 JOIN Table2
ON  Table1.KolonA = Table2.KolonA;

Chinook örnek

2 tabloyu birleştirme, Artist ve Album

SELECT A.Name AS ArtistName
, B.Title AS AlbumTitle
FROM Artist A
INNER JOIN Album B
ON A.ArtistId  = B.ArtistId 

3 tabloyu birleştirme, Artist, Album ve Track.

SELECT A.Name AS ArtistName
, B.Title AS AlbumTitle
, T.Name  AS TrackName
FROM Artist A
INNER JOIN Album B
ON A.ArtistId  = B.ArtistId 
INNER JOIN Track T ON T.AlbumId  = B.AlbumId   

ANSI-SQL-89 iç birleştirme sözdizimine dikkat edin

Aşağıda iç birleştirme için sözdizimini görebilirsiniz ancak lütfen kullanmayın. Birleştirme koşulunu açıkça kullanmak her zaman daha iyi olur.

SELECT ...
FROM   Table1, Table2
WHERE  Table1.KolonA = Table2.KolonA;

Tüm veritabanlarında çalışmaya devam edecektir ancak join anahtar sözcüğünü kullanarak birleştirme koşulları vermek her zaman daha iyidir. Ayrıca sol ve sağ birleştirmeler (left right join) için ANSI-SQL-92 sözdizimi daha anlaşılırdır.

61.4 Dış Birleştirme (Outer Join)

  • Belirtilen tablodan tüm satırları getirirken, diğer tablodan sadece eşleşen satırları getirir.
  • Bir tablonun satırlarının tümü getirilir.
  • Bu tablo “LEFT, RIGHT, FULL” ile belirtilir.
  • Eşleşmeyen özellik bilgileri için NULL getirilir.
  • Örneğin İletişim bilgisi olmayan öğrenciler için iletişim bilgisi kısmında NULL yazılacaktır.

61.4.1 Sol Dış Birleştirme (Left Outer Join)

Sol Dış Birleştirme veya Sol Birleştirme olarak bilinir.

Sol Birleştirme Venn diyagram

Sol birleştirmede, SQL yazımı sırasında sol (left) tarafta kalan tablodaki tüm satırlar getirilir.

Sol Birleştirme Satır Örneği

Yukarıdaki örnekte X ve Y tablolarındaki aynı anahtar değerleri (1 ve 2) birleştirilir. Sol birleştirme yaptığımız için X tablosundaki 3 anahtar değeride sonuca getirilir. Ama bu 3 değerinin bir karşılığı olmadığı için sonuç olarak null değeri gözükecektir. Y tablosundaki 4 anahtar değeri 2 tabloda birden aynı olmadığı için birleştirme sonucuna getirilmemiştir.

Aşağıda Öğrenci ve İletişim tablolarının sol birleştirme örneği görülebilir.

SELECT OgrenciNo,IletisimTipi,IletisimDegeri
FROM   OGRENCI LEFT INNER JOIN ILETISIM
ON  OGRENCI.OgrenciKey = ILETISIM.OgrenciKey;

61.4.2 Sağ Dış Birleştirme (Right Outer Join)

Sağ Birleştirme Venn diyagram
SELECT OgrenciNo,IletisimTipi,IletisimDegeri
FROM   OGRENCI RIGHT JOIN ILETISIM
ON  OGRENCI.OgrenciKey = ILETISIM.OgrenciKey;

Sağ Birleştirme Satır Örneği

Yukarıdaki örnekte X ve Y tablolarındaki aynı anahtar değerleri (1 ve 2) birleştirilir. Sağ birleştirme yaptığımız için Y tablosundaki 4 anahtar değeride sonuca getirilir. Ama bu 4 değerinin bir karşılığı olmadığı için sonuç olarak null değeri gözükecektir. X tablosundaki 3 anahtar değeri 2 tabloda birden aynı olmadığı için birleştirme sonucuna getirilmemiştir.

61.4.3 Tam Dış Birleştirme (Full Outer Join)

Tam birleştirme Venn diyagram
SELECT OgrenciNo,IletisimTipi,IletisimDegeri
FROM   OGRENCI FULL OUTER JOIN ILETISIM
ON  OGRENCI.OgrenciKey = ILETISIM.OgrenciKey;

Tam Birleştirme Satır Örneği

Yukarıdaki örnekte X ve Y tablolarındaki aynı anahtar değerleri (1 ve 2) birleştirilir. Hem sağ hem sol birleştirme yaptığımız için X tablosundaki 3 anahtar değeride sonuca getirilir. Ama bu 3 değerinin bir karşılığı olmadığı için sonuç olarak null değeri gözükecektir. Hem sağ hem sol birleştirme yaptığımız için Y tablosundaki 4 anahtar değeride sonuca getirilir. Ama bu 4 değerinin bir karşılığı olmadığı için sonuç olarak null değeri gözükecektir.

61.5 SQL JOIN SELF Kendi ile Birleşim

  • Aynı tablonun satırlarını birleştirir.
  • FROM cümlesinden aynı tablonun 2 sanal kopyasını oluşturarak satırları bir biri ile karşılaştır.
  • Bu işlem için en az bir takma ad (alias) gereklidir.
  • Takma isim verirken anlamlı bir isim vermeniz sql’ı daha sonra daha iyi anlamınız sağlayacaktır.

Chinook Yönetici Örneği

Chinook kim hangi yöneticiye rapor veriyor:

  • Aşağıdaki örnekte takma adlar için M (Manager-Yönetici) kullanılmıştır.
SELECT E.EmployeeID
      ,E.LastName AS EmployerLastName
      ,E.FirstName AS EmployerFirstName
      ,E.ReportsTo
      , M.EmployeeID as ManagerID
      , M.LastName AS ManagerLastName
      ,M.FirstName AS ManagerFirstName
  FROM Employee E 
  INNER JOIN Employee M
  ON E.ReportsTo = M.EmployeeID 

61.6 Cross Join - Çapraz Birleşim

  • İki tablodaki satırları kartezyen çarparak getirir.

  • Çapraz birleşim yaparken, kolonların bir birine uyumu aranmaz.

  • Bu durum test verisi üretmek için çok uygun bir kullanım olmasını sağlar.

  • Örneğin Öğrenci ve İletişim tabloları cross join yapılsın.

Öğrenci İletişim SONUÇLAR
Öğrenci No Öğrenci Öğrenci No İletişim
1 Atilla 1 ati@email1 Atilla ati@email1
ati@email1 Atilla ati@email2
2 Aydin 2 aydin@email1 Atilla aydin@email1
Aydın ati@email1
Aydın ati@email2
Aydın aydin@email1
  • Sonuçlar 2*3 = 6 kayıt olacaktır.
  • Test için veri üretilmesi haricinde istenmeyen bir durumdur.
SELECT OgrenciNo,IletisimTipi,IletisimDegeri
FROM   OGRENCI CROSS JOIN ILETISIM
ON  OGRENCI.OgrenciKey = ILETISIM.OgrenciKey;

Chinook çapraz birleştirme örnekleri

Aşağıdaki sorgu 472 satır getirecektir.

SELECT * FROM Customer c 
CROSS JOIN
Employee e

Çünkü Customer 59 kayıt, Employee 8 kayıt bulundurur ve 59x8 = 472’dir.

SELECT 
(SELECT COUNT(*) FROM Customer c) AS CustomerCount,
(SELECT COUNT(*) FROM Employee e) AS EmployeeCount,
(SELECT COUNT(*) FROM Customer c) * (SELECT COUNT(*) FROM Employee e) AS CustomerCountXEmployeeCount

Aşağıdaki sorgu Album ve MediaType tablolarını çaprazlayarak getirir. Yine bu örnekte herhangi bir ortak kolon yoktur.

SELECT * FROM Album  
CROSS JOIN
MediaType

Aşağıdaki sorgu daha sonra öğreneceğimiz WITH ile sanal isim tabloları oluşturup bunları cross join ile kartezyen çarpım yapıyor. Bu sayede test verisi olarak isimler üretiyoruz.

WITH Names1 AS
(
    SELECT e.FirstName ,e.LastName FROM Employee e
), Names2 AS
(
    SELECT c.FirstName ,c.LastName FROM Customer c
)
SELECT n1.FirstName,n2.LastName FROM Names1 as n1 CROSS JOIN Names2 as n2
UNION
SELECT n2.FirstName,n1.LastName FROM Names1 as n1 CROSS JOIN Names2 as n2