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
Aşağıda iç birleştirme (inner join) için aşağıda başka bir örnek resim görebilirsiniz.
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)
- 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;
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
AS AlbumTitle
, B.Title 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
AS AlbumTitle
, B.Title AS TrackName
, T.Name 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ştirmede, SQL yazımı sırasında sol (left) tarafta kalan tablodaki tüm satırlar getirilir.
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)
SELECT OgrenciNo,IletisimTipi,IletisimDegeri
FROM OGRENCI RIGHT JOIN ILETISIM
ON OGRENCI.OgrenciKey = ILETISIM.OgrenciKey;
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)
SELECT OgrenciNo,IletisimTipi,IletisimDegeri
FROM OGRENCI FULL OUTER JOIN ILETISIM
ON OGRENCI.OgrenciKey = ILETISIM.OgrenciKey;
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
AS EmployerLastName
,E.LastName AS EmployerFirstName
,E.FirstName
,E.ReportsToas ManagerID
, M.EmployeeID AS ManagerLastName
, M.LastName AS ManagerFirstName
,M.FirstName 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
AS
), Names2
(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