Sol, Sağ, Dış ve İç Bağlantılar arasındaki fark nedir?


562

Tüm bu farklı birleşimleri nasıl ayırt edeceğimizi merak ediyorum ...


60
Korku Kodlama SQL
Birleşmeleri

3
Ayrıca sizin anlayış seviyenize bağlıdır, sizin gibi biri için bu yazı hiçbir şey yapmaz ama belki de tam olarak anlayamayan biri için bu oldukça açıktır
SQLMenace

6
Bu stackoverflow.com/questions/419375/sql-join-differences bir kopyası ve şüphesiz diğerleri ...
cletus

1
Bu bana çok yardımcı oldu ... en kolay yol test tabloları yapmak ve onlarla oynamak. = P
daGrevis

Yanıtlar:


797

Basit Örnek : Diyelim ki bir Studentstablonuz ve bir Lockerstablonuz var. SQL'de, bir birleşimde belirttiğiniz ilk tablo Students, SOL ve ikinci tablo Lockersise SAĞ tablo.

Her öğrenci bir dolap tahsis yüzden bir var olabilir LockerNumbersütunundaStudent tabloda . Birden fazla öğrenci potansiyel olarak tek bir dolapta olabilir, ancak özellikle okul yılının başında, bazı kilitli olmayan gelen öğrenciler ve atanmış öğrenci olmayan bazı kilitli dolaplarınız olabilir.

Bu örnek uğruna, diyelim ki 70'i dolaplı 100 öğrenciniz var. 40'ı en az 1, 10'u öğrenci olmak üzere toplam 50 dolap var.

INNER JOIN , " bana tüm kilitli öğrencileri göster " ile eşdeğerdir .
Dolapsız öğrenciler veya öğrenci olmayan dolaplar eksik.
70 satır döndürür

SOL DIŞ BAĞLANTI " tüm öğrencilere göster, eğer varsa, kendi soyunma dolapları ile " olurdu .
Bu genel bir öğrenci listesi olabilir veya dolabı olmayan öğrencileri tanımlamak için kullanılabilir.
100 satır döndürür

DOĞRU DIŞ ORTAK " tüm dolapları göster ve eğer varsa onlara atanan öğrenciler " olacaktır.
Bu, hiçbir öğrencisi atanmamış dolapları veya çok fazla öğrencisi olan dolapları tanımlamak için kullanılabilir.
80 satır döndürür (40 dolaptaki 70 öğrencinin yanı sıra öğrencisi olmayan 10 dolap listesi)

TAM DIŞ BAĞLANTI aptalca olurdu ve muhtemelen çok fazla faydası olmaz.
Böyle bir şey " Bana bütün öğrencileri ve tüm dolap göstermek ve onları maç yapabileceğiniz "
İade 110 satır (dolap olmayanlar dahil tüm 100 öğrenci,. Artı hiçbir öğrenciyle 10 dolap)

CROSS JOIN bu senaryoda da oldukça aptalca. Öğrenciler tablosundaki
bağlantılı lockernumberalanı kullanmaz , bu nedenle, aslında var olsun ya da olmasın, her olası öğrenci-kilitli eşleştirme için büyük bir dev listeyle sonuçlanırsınız.
5000 satır döndürür (100 öğrenci x 50 kilitli dolap). Yeni öğrencileri boş dolaplarla eşleştirmek için başlangıç ​​noktası olarak (filtreleme ile) yararlı olabilir.


12
Örneğinizi kullanarak, CROSS birleşimi soyunma atamaları oluşturmak için bir başlangıç ​​noktası olarak yararlı olacaktır: olası tüm kombinasyonlarla başlayın ve ardından listeden sonuçları filtrelemek için diğer ölçütleri kullanın.
Joel Coehoorn

1
Güzel cevap. Cross Join'in çok sayıda kayda ihtiyacınız olduğunda genellikle birkaç satırdan test verileri oluşturmak için kullanıldığını düşünüyorum.
Eli

6
TAM DIŞ BAĞLANTILAR, yetimsiz verileri ararken veya aynı veri kümesinin farklı sürümlerini karşılaştırırken yararlı olabilir.
Lara Dougan

3
Çapraz katılmak aka kartezyen ürün
JavaRocky

3
Sorgunuza nasıl başlayacağınızı birleştirme türünün sonucunu etkiler düşünüyorum. Örneğin, SELECT * FROM students RIGHT OUTER JOIN lockers...bundan farklı bir sonuç doğurur SELECT * FROM lockers RIGHT OUTER JOIN students.... Harika bir yanıt, ancak tam SQLsorgularla güncellendiğini görmek isterdim
jbmilgrom

141

Üç temel birleştirme türü vardır:

  • INNERjoin iki tabloyu karşılaştırır ve yalnızca bir eşleşme olduğunda sonuçları döndürür. 1. tablodaki kayıtlar, 2. tablodaki birden çok sonuçla eşleştiğinde çoğaltılır. INNER birleşimleri sonuç kümelerini küçültme eğilimindedir, ancak kayıtlar çoğaltılabildiğinden bu garanti edilmez.
  • CROSSjoin iki tabloyu karşılaştırır ve her iki tablodaki olası satır kombinasyonlarını döndürür. Bu tür bir birleşmeden anlamlı bile olmayan çok sayıda sonuç alabilirsiniz, bu yüzden dikkatli kullanın.
  • OUTERjoin iki tabloyu karşılaştırır ve bir eşleşme mevcut olduğunda verileri veya aksi takdirde NULL değerleri döndürür. INNER birleşiminde olduğu gibi, bu, diğer tabloda birden çok kayıtla eşleştiğinde bir tablodaki satırları çoğaltır. OUTER birleşimleri sonuç kümelerini büyütme eğilimindedir, çünkü kendi başlarına kümedeki kayıtları kaldırmazlar. Ayrıca NULL değerlerinin ne zaman ve nerede ekleneceğini belirlemek için bir OUTER birleşimine hak kazanmanız gerekir:
    • LEFT anlamına gelir ne olursa olsun 1. tablodaki tüm kayıtları tutmak ve 2. tablo eşleşmediğinde NULL değerleri girin.
    • RIGHT bunun tersi anlamına gelir: ne olursa olsun 2. tablodaki tüm kayıtları saklayın ve 1. tablo eşleşmediğinde NULL değerleri ekleyin.
    • FULL her iki tablodaki tüm kayıtları tutmak ve eşleşme yoksa her iki tabloya da NULL değeri eklemek anlamına gelir.

Genellikle OUTERanahtar kelimenin söz diziminden çıkarıldığını görürsünüz . Bunun yerine "SOL BİRLEŞTİR", "SAĞ BİRLEŞTİR" veya "TAM BİRLEŞTİR" olacaktır. Bunun nedeni, INNER ve CROSS birleşimlerinin SOL, SAĞ veya TAM açısından hiçbir anlamı olmadığı ve bu nedenle bunların bir OUTER birleşimini açıkça belirtmek için tek başlarına yeterli oldukları için yapılır.

Her bir türü ne zaman kullanmak isteyebileceğinize ilişkin bir örnek:

  • INNER: Tüm kayıtları karşılık gelen "InvoiceLines" ile birlikte "Invoice" tablosundan döndürmek istiyorsunuz. Bu, her geçerli Faturada en az bir satır olacağını varsayar.
  • OUTER: Belirli bir Fatura için tüm "InvoiceLines" kayıtlarını ve karşılık gelen "InventoryItem" kayıtlarını döndürmek istiyorsunuz. Bu, hizmet satan bir işletmedir, böylece tüm InvoiceLines öğelerinin IventoryItem öğesi olmayacaktır.
  • CROSS: Her biri '0' ila '9' değerlerini tutan 10 satırlı bir rakam tablonuz var. Aralık içinde her gün için bir kayıt olacak şekilde birleştirilecek bir tarih aralığı tablosu oluşturmak istiyorsunuz. Bu tabloyu tekrar tekrar CROSS ile birleştirerek, ihtiyacınız olduğu kadar ardışık tamsayı oluşturabilirsiniz (10'dan 1'e kadar güçle başladığınızda, her birleştirme üsse 1 ekler). Ardından, bu değerleri aralık için temel tarihinize eklemek için DATEADD () işlevini kullanın.

1
Güzel. Bunu sadece 'JOIN' yazarsanız, INNER JOIN anlamına gelir.
matpop

47

Sadece 4 çeşit var:

  1. İç birleşim : En yaygın tip. Birleştirme sırasına uyan her bir giriş satırı çifti için bir çıktı satırı oluşturulur.
  2. Sol dış birleştirme : sağdaki tabloda uygun satır bulunabilir olan herhangi bir satır olduğu takdirde, bir iç aynı olması hariç birleştirme, bir satır ile soldaki tablosundaki değerleri içeren çıktı, NULLher biri için sağdaki tabloda değer. Bu, soldaki tablodaki her satırın çıktıda en az bir kez görüneceği anlamına gelir.
  3. Sağ dış birleşim : Tabloların rolleri tersine çevrildiğinde, sol dış birleşim ile aynıdır.
  4. Tam dış birleşim : Sol ve sağ dış birleşimlerin birleşimi. Her iki tablodaki her satır çıktıda en az bir kez görünür.

Bir "çapraz birleştirme" veya "kartezyen birleştirme" basitçe, hiçbir birleşim koşulunun belirtilmemiş olduğu bir iç birleşimdir, bu da tüm satır çiftlerinin çıkmasına neden olur.

Atladığım TAM birleşimleri işaret ettiği için RusselH'a teşekkürler.


1
tam dış birleşim ve çapraz birleşim (Kartezyen ürün) ne olacak?
SQLMenace

tam iki dış birleşmeye eşdeğerdir
RussellH

25
TAM iç birleşiminizi batırdığınızda elde ettiğiniz şeydir ve sonra burada "N yerine N ^ 2 satır alıyorum" sorusunu soruyorsunuz? Sonra herkes sana ÇAPRAZ gelir.
Paul Tomblin

24

SQL JOINS farkı:

Hatırlaması çok kolay:

INNER JOIN yalnızca her iki tabloda ortak olan kayıtları gösterir.

OUTER JOIN her iki tablonun tüm içeriği eşleştirilmiş olsun ya da olmasın birleştirilmiştir.

LEFT JOINile aynı LEFT OUTER JOIN- (İlk sağ tablo kayıtlarından eşleşen sağ tablo kayıtlarıyla kayıtları seçin.)

RIGHT JOINile aynıdır RIGHT OUTER JOIN- (Soldaki tablo kayıtlarıyla eşleşen ikinci (en sağdaki) tablodan kayıtları seçin.)

resim açıklamasını buraya girin


Venn diyagram çevrelerini etiketlemenin doğru ve alakalı bir yolu var, ama bu değil. Daireler giriş tabloları değildir. Ayrıca sonuç satırları giriş satırı değildir, bu nedenle açıklamanız yanlıştır. Ayrıca bu net değil - "her ikisi için ortak", "eşleştirilmiş", "birleştirilmiş" açıklamıyorsunuz.
philipxy

9

Check out Vikipedi'de (SQL) Üyelik

  • İç birleşim - İki tablo verildiğinde, iç birleşim her iki tabloda da bulunan tüm satırları döndürür
  • sol / sağ (dış) birleştirme - İki tablo verildiğinde, birleştirmenizin sol veya sağ tablosunda bulunan tüm satırları döndürür, ayrıca birleştirme yan tümcesi eşleştiğinde veya null için boş değer döndürülürse diğer taraftan satırlar döndürülür bu sütunlar

  • Tam Dış - Verilen iki tablo tüm satırları döndürür ve sol veya sağ sütun orada olmadığında boş değer döndürür

  • Çapraz Bağlantılar - Kartezyen birleşim ve dikkatli kullanılmazsa tehlikeli olabilir


6

Daha görünür hale getirmek yardımcı olabilir. Bir örnek:

Tablo 1:

ID_STUDENT STUDENT_NAME

1               Raony
2               Diogo
3               Eduardo
4               Luiz

Tablo 2:

ID_STUDENT KİLİT

3               l1
4               l2
5               l3

Ne zaman alırım:

-Inner join of Table 1 and Table 2: 

    - Inner join returns both tables merged only when the key 
      (ID_STUDENT) exists in both tables

    ID_STUDENT       STUDENT_NAME      LOCKER   

        3               Eduardo          l1
        4               Luiz             l2

-Left join of Table 1 and Table 2:

    - Left join merges both tables with all records form table 1, in 
      other words, there might be non-populated fields from table 2

    ID_ESTUDANTE    NOME_ESTUDANTE     LOCKER   

        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2

-Right join of table 1 and table 2:

    - Right join merges both tables with all records from table 2, in 
      other words, there might be non-populated fields from table 1

    ID_STUDENT        STUDENT_NAME     LOCKER   

        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

-Outter join of table 1 and table 2:

    - Returns all records from both tables, in other words, there
      might be non-populated fields either from table 1 or 2.

    ID_STUDENT        STUDENT_NAME     LOCKER   
        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

4

LEFT JOINve s RIGHT JOINtürleridir OUTER JOIN.

INNER JOIN varsayılan - her iki tablodaki satırların birleştirme koşuluyla eşleşmesi gerekir.


5
Bu cevabın nasıl birçok oy hakkı olduğuna inanamıyorum ve aynı zamanda bu kadar eksik.
nbro

Bence orijinal soruya daha iyi bir cevaptı.
RussellH

3

İç birleşim : Satırları yalnızca her iki tablodan da veri aldığında göster.

Dış katılmak : (sol / sağ) : Tüm sonuçları göster sağ / sol eşleştirilmiş satır (masanın s o takdirde) var ya da değil.


2

İlk başta katılmak ne yapar anlamak gerekir? Birden çok tablo bağlarız ve birleştirilmiş tablolardan belirli sonuçlar elde ederiz. Bunu yapmanın en basit yolu çapraz birleştirme .

Diyelim ki tableA'nın iki A ve B sütunu var. Ve TableB'nin üç C ve D sütunu var. Ardından, gerçek verileri elde etmek için birincil anahtarı kullanarak eşleşmemiz gerekir.

Sol: Sol tablodan tüm kayıtları ve sağ tablodan eşleşen kaydı döndürür.

Sağ: Sol birleşmenin tersine dönecektir. Tüm kayıtları sağ tablodan ve eşleşen kayıtları sol tablodan döndürür.

İç: Bu kavşak gibidir. Her iki tabloda da yalnızca eşleşen kayıtları döndürür.

Dış: Ve bu sendika gibi. Her iki tablodan da kullanılabilir tüm kayıtları döndürür.

Bazı zamanlarda tüm verilere ihtiyacımız yoktur ve ayrıca sadece ortak verilere veya kayıtlara ihtiyacımız vardır. bu birleştirme yöntemlerini kullanarak kolayca elde edebiliriz. Sol ve sağ birleşimin de dış birleşim olduğunu unutmayın.

Tüm kayıtları sadece çapraz birleştirmeyi kullanarak alabilirsiniz. Ancak milyonlarca kayıt söz konusu olduğunda pahalı olabilir. Bu yüzden sol, sağ, iç veya dış birleşimi kullanarak basitleştirin.

Teşekkürler

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.