Ayrıca LEFT JOIN
, RIGHT JOIN
ve FULL JOIN
nasıl kullanılır?
Yinelenmeyen sütunlarda birleştirme yaptığınızı varsayarsak, ki bu çok yaygın bir durumdur:
A ve B'nin bir iç birleşimi, A'nın B ile kesişmesinin sonucunu, yani bir Venn diyagramı kesişiminin iç kısmını verir.
A ve B'nin bir dış birleşimi, A birleşimi B'nin sonuçlarını, yani bir Venn diyagramı birleşiminin dış kısımlarını verir.
Örnekler
Her biri tek sütunlu iki tablonuz ve aşağıdaki gibi verileriniz olduğunu varsayalım:
A B
- -
1 3
2 4
3 5
4 6
(1,2)'nin A'ya özgü, (3,4)'ün ortak ve (5,6)'nın B'ye özgü olduğuna dikkat edin.
İçten katıl
Eşdeğer sorgulardan birini kullanan bir iç birleştirme, iki tablonun kesişimini, yani ortak olan iki satırı verir.
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
a | b
--+--
3 | 3
4 | 4
Sol dış birleştirme
Sol dış birleştirme A'daki tüm satırları ve B'deki tüm ortak satırları verecektir.
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
Sağ dış birleştirme
Sağ dış birleştirme B'deki tüm satırları ve A'daki tüm ortak satırları verecektir.
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
Tam dış birleştirme
Tam dış birleştirme size A ve B'nin birleşimini, yani A'daki tüm satırları ve B'deki tüm satırları verecektir. A'daki bir şeyin B'de karşılık gelen bir verisi yoksa, B kısmı boştur ve bunun tersi de geçerlidir.
select * from a FULL OUTER JOIN b on a.a = b.b;
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
Bir iç birleştirme yalnızca birleştirmenin diğer (sağ) tarafında eşleşen bir kayıt varsa satırları gösterir.
Bir (sol) dış birleştirme, birleştirmenin diğer (sağ) tarafında eşleşen satırlar olmasa bile, sol taraftaki her kayıt için satırları gösterir. Eşleşen satır yoksa, diğer (sağ) tarafın sütunları NULL gösterecektir.
İç birleştirmeler, birleştirilen tabloda ilgili kimliğe sahip bir kaydın bulunmasını gerektirir.
Dış birleştirmeler, sağ taraf için hiçbir şey mevcut olmasa bile sol taraf için kayıtları döndürür.
Örneğin, bir Orders ve bir OrderDetails tablonuz var. Bunlar bir "OrderID" ile ilişkilidir.
Siparişler
SiparişDetayları
Talep
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
yalnızca OrderDetails tablosunda da bir şey olan Siparişleri döndürür.
Eğer bunu OUTER LEFT JOIN olarak değiştirirseniz
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
o zaman OrderDetails kayıtları olmasa bile Orders tablosundan kayıtları döndürür.
Bunu, WHERE OrderDetails.OrderID IS NULL
gibi bir where cümlesi ekleyerek olası bir yetim siparişi gösteren herhangi bir OrderDetails'e sahip olmayan Siparişleri bulmak için kullanabilirsiniz.