Tüm bu farklı birleşimleri nasıl ayırt edeceğimizi merak ediyorum ...
Tüm bu farklı birleşimleri nasıl ayırt edeceğimizi merak ediyorum ...
Yanıtlar:
Basit Örnek : Diyelim ki bir Students
tablonuz ve bir Lockers
tablonuz var. SQL'de, bir birleşimde belirttiğiniz ilk tablo Students
, SOL ve ikinci tablo Lockers
ise SAĞ tablo.
Her öğrenci bir dolap tahsis yüzden bir var olabilir LockerNumber
sü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ı lockernumber
alanı 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.
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 SQL
sorgularla güncellendiğini görmek isterdim
Üç temel birleştirme türü vardır:
INNER
join 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.CROSS
join 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.OUTER
join 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 OUTER
anahtar 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.Sadece 4 çeşit var:
NULL
her 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. 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.
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 JOIN
ile aynı LEFT OUTER JOIN
- (İlk sağ tablo kayıtlarından eşleşen sağ tablo kayıtlarıyla kayıtları seçin.)
RIGHT JOIN
ile aynıdır RIGHT OUTER JOIN
- (Soldaki tablo kayıtlarıyla eşleşen ikinci (en sağdaki) tablodan kayıtları seçin.)
Check out Vikipedi'de (SQL) Üyelik
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
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
İç 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.
İ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