JOIN, aralarındaki ilgili sütunu temel alarak iki veya daha fazla tablodaki satırları birleştirmek için kullanılır.
Örneğin aşağıdaki siparişler tablosuna bir göz atalım.
SiparisID | MusteriID | SiparisTarih |
---|---|---|
1001 | 2 | 2022-09-18 |
1002 | 34 | 2022-09-19 |
1003 | 53 | 2022-09-20 |
Şimdi müşteri tablosunu inceleyelim.
MusteriID | MusteriAdi | MusteriSehir |
---|---|---|
1 | Fatih Alkan | İstanbul |
2 | Beyazıt Alkan | İstanbul |
3 | Şenay Dalğıç | Ankara |
“Siparişler (TblSiparis)” tablosundaki “MusteriID” sütununun “Müşteriler (TblMusteri)” tablosundaki “MusteriID” sine atıfta bulunduğuna dikkat edin. Yukarıdaki iki tablo arasındaki ilişki “MusteriID” sütunu üzerinden kurulmuştur.
Şimdi yukarıda ki tabloları birlikte okumaya çalıştığımızda şöyle bir durum ortaya çikar: Siparişler tablosunda ki 1002 Numaralı sipariş ilişkide bulunduğu MusteriID (2 nolu ID) sutunu vasıtasıyla Müşteriler tablosuna bağlanır. Bizler buradan 1002 nolu siparişin (2 nolu ID) Beyazıt Alkan’a ait olduğunu anlarız.
Bu bağlantıyı aşağıda ki SQL deyimi ile (bir INNER JOIN içeren) oluşturabiliriz:
SELECT TblSiparis.SiparisID, TblMusteri.MusteriAdi, TblSiparis.SiparisTarih
FROM TblSiparis
INNER JOIN TblMusteri ON TblSiparis.MusteriID=TblMusteri.MusteriID;
Sonuç:
SiparisID | MusteriAdi | SiparisTarih |
---|---|---|
1002 | Beyazıt Alkan | 2022-09-18 |
SQL JOIN Tiplerinin Farkları
- INNER JOIN: Her iki tabloda da eşleşen değerlere sahip kayıtları döndürür.
- LEFT (OUTER) JOIN: Sol tablodaki tüm kayıtları ve sağ tablodaki eşleşen kayıtları döndürür.
- RIGHT (OUTER) JOIN: Sağ tablodaki tüm kayıtları ve sol tablodaki eşleşen kayıtları döndürür.
- FULL (OUTER) JOIN: Sol veya sağ tabloda bir eşleşme olduğunda tüm kayıtları döndürür.
- CROSS JOIN: Birleştirilen tablolardan seçilen veriler arasındaki tüm kombinasyonları getirir.
*Aşağıda ki konuların örnekleri Microsoft’un bizlere üzerinde çalışabilmemiz için ücretsiz olarak sunduğu Northwind Database üzerinden örneklendirilmiştir. Sizlerde aşağıda linki kullanarak Northwind Databas’ini indirebilirsiniz.
https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/northwind-pubs
SQL LEFT (OUTER) JOIN
LEFT JOIN , sol tablodaki (tablo1) tüm kayıtları ve sağ tablodaki (tablo2) eşleşen kayıtları döndürür. Eğer eşleşme yoksa sağ tablodan 0 kayıt döndürür.
SELECT ProductName , CategoryName
FROM Products AS P LEFT OUTER JOIN Categories AS C ON P.CategoryID = C.CategoryID;
-- LEFT OUTER JOIN: ifadesinin solunda kalan (Products) tablosundaki tüm kayıtlar gelirken, sağındaki (Categories) tablosundaki ilişkili kayıtlar getirilecek.
Not: LEFT JOIN anahtar sözcüğü, sağ tabloda (Categories) eşleşme olmasa bile sol tablodaki (Products) tüm kayıtları döndürür.
SQL RIGHT (OUTER) JOIN
RIGHT JOIN, sağ tablodaki (tablo2) tüm kayıtları ve sol tablodaki (tablo1) eşleşen kayıtları döndürür. Eşleşme yoksa sonuç sol taraftan 0 kayıttır.
SELECT ProductName , CategoryName
FROM Categories RIGHT JOIN Products ON Categories.CategoryID = Products.CategoryID;
-- RIGHT OUTER JOIN: Sorguda katılan tablolardan sağdakinin tüm kayıtları getirilirken, soldaki tablodaki sadece ilişkili olan kayıtlar getirilir.
Not: RIGHT JOIN anahtar sözcüğü, sol tabloda (Products) eşleşme olmasa bile sağ tablodaki (Categories) tüm kayıtları döndürür.
SQL FULL JOIN
FULL OUTER JOIN anahtar sözcüğü, sol (tablo1) veya sağ (tablo2) tablo kayıtlarında bir eşleşme olduğunda tüm kayıtları döndürür.
SELECT ProductName , CategoryName
FROM Categories FULL JOIN Products ON Categories.CategoryID = Products.CategoryID;
Not: FULL OUTER JOIN anahtar sözcüğü, diğer tablo eşleşsin ya da eşleşmesin, her iki tablodaki eşleşen tüm kayıtları döndürür. Böylece “Products”de “Categories”de eşleşmeyen satırlar varsa veya “Products”de “Categories”de eşleşmeyen satırlar varsa o satırlar da listelenir.
SQL CROSS JOIN
Bir tablodaki bir kaydın diğer tablodaki tüm kayıtlarla eşleştirilmesini sağlar. d tablodaki satır sayısının ikinci tablodaki satır sayısıyla çarpımı olan bir sonuç kümesi üretir.
SELECT COUNT(*)
FROM Categories; -- 8 kayıt
SELECT COUNT(*)
FROM Products; -- 77 kayıt
-- 616 (77*8) Kayıt
SELECT CategoryName , ProductName
FROM Categories CROSS JOIN Products;
Not: CROSS JOIN anahtar sözcüğü, sol tablodaki (Categories) tüm kayıtlarla (8 Kayıt) sağ taraftaki (products) tüm kayıtların (77 Kayıt) kartezyen çarpımını sonuç olarak döndürür. Toplam 616 kayıt (77×8)