INNER JOIN" ve "OUTER JOIN" arasındaki fark nedir?

Ayrıca LEFT JOIN, RIGHT JOIN ve FULL JOIN nasıl kullanılır?

Çözüm

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
Yorumlar (17)

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.

Yorumlar (0)

İç 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ş kimliği
  • MüşteriAdı

SiparişDetayları

  • OrderDetailID
  • Sipariş kimliği
  • ÜrünAdı
  • Miktar
  • Fiyat

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.

Yorumlar (1)