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


35

Ben SQL'de yeniyim ve bu iki JOINtip arasındaki farkın ne olduğunu bilmek istedim ?

SELECT * 
FROM user u
INNER JOIN telephone t ON t.user_id = u.id

SELECT * 
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id

Birini veya diğerini ne zaman kullanmalıyım?


6
Bu bir DBA sorusu olarak uygun mu? Bu bana daha fazla kodlayıcı bir soru gibi görünüyor.
BlackICE


Site için yanlış olduğunu düşünüyorsanız @David sonra VtC. Her zaman yeniden açabiliriz.
jcolebrand

3
Bu harika bir soru ve site için çok uygun olduğunu düşünüyorum.
datagod

bunun bir DBA'dan başka bir yere taşınmaması gerekmekte, DB performansında ince ayar yapmak için bir noob DBA kullanılmıştı: P
AmDB

Yanıtlar:


32
  • Bir iç birleştirme , yalnızca birleştirilmiş tuşların her iki belirtilen tabloda olduğu kayıtları seçer .
  • Bir sol dış birleşim ilk tablodan tüm kayıtları ve birleştirilen anahtarları maç ikinci tabloda herhangi bir kayıt seçecektir.
  • Bir sağ dış birleşim ikinci tablodan tüm kayıtları ve birleştirilen anahtarları maç ilk tablodaki tüm kayıtları seçer.

İlk örnekte, kullanıcı için en az bir telefon kaydı mevcutsa, yalnızca kullanıcıların listesini ve telefon numaralarını döndürürsünüz.

İkinci örneğinizde, tüm kullanıcıların bir listesini ve varsa telefon kayıtlarını (eğer kullanılamıyorsa, NULLtelefon değerleri için alacaksınız) geri göndereceksiniz .


13

Ne zaman birisi bu soruyu sorsa, cevabı var: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

Umarım anlamana yardımcı olur.


3
20 yıldır birleşme ile çalıştım ve bu şemalar bana kafa karıştırıcı geldi.
Hogan

3
@Hogan ile birlikteyim - ven diyagramları bunun için en iyi açıklama değil.
Joe

Tek gösteren, bir venn şemasını anlamadığınızdır. Katılım türleriyle mükemmel bir ilişki kurarlar ancak katılımcılar için yeni olanları anlamaya yardımcı olacak bir araç olduklarını akılda tutarlar. Daha önce farklı bir konsepte sahip birleşme olduğunu öğrendiyseniz, o zaman size tanıdık gelmemek zorunludur. Bu sorun değil, aynı zamanda şemaların kullanışlılığı için iyi bir gösterge değil.
JamesRyan

@jamesryan bu doğru değil, mükemmel bir ilişki kurmuyorlar, katılımlar kümelerin kartezyen ürünlerine benziyor, kesişme ve birleşme değil, venn diagram analogu sadece benzersiz anahtarlara katılırsanız çalışır, çoğaltılmış anahtarlarınız varsa kaybedersiniz kartezyen ürün yönü.
Will

1
Ben kesinlikle katılmıyorum, venn diyagramları zaten çok iyi tanımlanmış bir yorumu var, kesişme ve sendika belirledi. Benzersiz olmayan anahtarlara katılırken, birleşimler bu yoruma uymaz. Bence Venn diyagramlarını çok geniş yorumluyorsun.
olacak

8

Bir iç birleşim birleştirilmiş birleştirme kriterlere göre edilebilir döner satır.
Bir dış birleşim ... döner bu ve tüm satırları
   bir ilk tablodan ... katılmak solda
   bir ikinci tablosundan ... sağ katılmak
   ... Bir için her iki tablodan tam katılmak

Birini veya diğerini ne zaman kullanacağınızı seçmek, hangi verilere ihtiyacınız olduğunu belirleme konusudur. Örneğin, yalnızca telefonda kullanıcı kimlikleriyle eşleşen kullanıcı kimlikleri olan kayıtlara ihtiyacınız varsa, iç birleştirmeyi kullanın. Kullanıcıdan, eşleşen telefon girişi olmayan satırları da dahil etmek istiyorsanız, sol birleşim uygun olacaktır.

Daha fazla bilgi için StackOverflow'ta bu soruya bakın .


7

Aşağıdaki gibi 2 tablonuz varsa:

Table1 :   A1    B1          Table2  :    B2     C2 
           -     -                        -      -
           1     2                        1      1
           2     4                        2      4
           3     5                        5      2

Inner Join kullanıyorsanız şunları elde edersiniz:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2

Full Outer Join kullanıyorsanız şunları elde edersiniz:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL
NULL   NULL    1       1

Left Outer Join kullanıyorsanız şunları elde edersiniz:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL

6

Dış birleştirme açıkça null üretmek için tasarlanmıştır ve bu nedenle, genel olarak kaçınılması gerekir. İlişkisel olarak konuşursak, bu bir tür av tüfeği evliliğidir: Tabloları bir tür sendikaya zorlar - evet, sendika demek istiyorum, söz konusu tablolar sendika için olağan şartlara uymadığında bile. Aslında, birliği yapmadan önce tablolardan birini veya her ikisini de boş bırakarak doldurur, böylece sonuçta bu normal gereksinimlere uymasını sağlar. Ancak, bu dolgunun, bu örnekte olduğu gibi, boş değerler yerine uygun değerlerle yapılmaması için hiçbir neden yoktur:

SELECT SNO , PNO 
FROM   SP 
UNION  
SELECT SNO , 'nil' AS PNO 
FROM   S 
WHERE  SNO NOT IN ( SELECT SNO FROM SP )

Alternatif olarak, aynı sonuç COALESCE, burada olduğu gibi SQL dış birleştirme işlecini kullanarak da elde edilebilir:

SELECT SNO , COALESCE ( PNO , 'nil' ) AS PNO 
FROM ( S NATURAL LEFT OUTER JOIN SP ) AS TEMP

CJ Tarihine Göre "SQL ve İlişkisel Teori: Doğru SQL Kodunun Nasıl Yazılacağı" bölümündeki Dış Birleştirme (4.6) Üzerine Bir Açıklama


5

İç bir birleşim, görüntülenen tek sonuçların, her iki tabloda da tuşların bulunduğu sonuçlardır. Bir dış birleştirme, tüm tuşların sonuçlarını bir tabloda, ilkinden bir sol birleştirme ve ikinciden bir sağ birleştirme görüntüler. Örneğin:

Tablo1'de aşağıdaki birincil anahtar ve veri çiftleri olduğunu varsayalım: (1, a), (2, b), (3, c)

Ayrıca tablo2'nin aşağıdaki birincil anahtar ve veri çiftlerine sahip olduğunu varsayalım: (1, eğlenceli), (3, olabilir), (4, olur)

Bu nedenle, birincil tuşlardaki tablo1 ila tablo2 arasındaki iç bağlantı aşağıdaki sonuçlara neden olur (ilk önce ortak anahtar, ilk tablonun ikinci maddesi ikinci, ikinci tablonun ikinci maddesi üçüncü): (1, a, eğlenceli), ( 3, c, olabilir)

Birincil tuşlardaki tablo1 ila tablo2'nin sol dış birleşimi, aşağıdaki sonuçtaki üçüzleri (yukarıdaki ile aynı formatta) verir: (1, a, eğlenceli), (2, b, NULL), (3, c, can)

Birincil tuşlardaki tablo1'den tablo2'ye sağ dış birleştirme, aşağıdaki sonuç üçlelerini (yukarıdaki ile aynı formatta) verir: (1, a, eğlenceli), (3, c, can), (4, NULL, olur)

Umarım bu kavramı düzgünce iyi açıklar.


4

Biraz daha sezgisel anlatmaya çalışmama izin verin.

İç bağlantı bir veya daha fazla telefonu olan kullanıcıları, telefon numaralarıyla birlikte gösterir.

Sol dış birleşim ayrıca telefon olmayan 'kullanıcıları' listeler.


4

Ne zaman ne zaman kullanılacağını sorduğundan, burada sorgular içeren bir senaryo var - gereksinime göre hangisinin kullanılacağını seçin.

Veri:

Tablo Kullanıcıları 10 kayıtlıdır. Tablo Phoneno'da 6 kayıt vardır (1: 1 ilişkisi olan, PhoneNo'daki bir girişin Kullanıcılar'daki yalnızca bir girişe ve PhoneNo'daki yalnızca bir girişin Kullanıcılar'daki belirli bir girişe başvuruda bulunabileceği anlamına gelir).

Gereksinim 1: Tüm kullanıcılara telefon numaralarını gösterin. Telefon numarası olmayan kullanıcıları yoksay.

Sorgu:

SELECT u.uid, u.name, p.phonno 
  FROM user u 
INNER JOIN phones p ON p.uid = u.uid

Sonuç: telefon numarası olan 6 kullanıcıyı gösterir.

Gereksinim 2: Tüm kullanıcılara telefon numaralarını gösterin. Kullanıcının telefon ekranı 'N / A' yoksa (kullanılamaz)

Sorgu:

SELECT u.uid, u.name, ifnull(p.phonno,'N/A') 
  FROM user u 
LEFT OUTER JOIN phones p ON p.uid = u.uid

Sonuç:

10 kaydın hepsini gösterir

Not: ifnull, null değerini dönüştürmek için bir MySql sözdizimidir. Fonon boşken db motorunu 'N / A' göstermesi için bu işlevi kullandım. Başka bir DBMS kullanıyorsanız uygun işlevi arayın. SQL Server'da bu CASEifadeyi kullanmanız gerekir .

Umarım bu yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.