Soru “INNER JOIN” ve “OUTER JOIN” arasındaki fark nedir?


Ayrıca nasıl LEFT JOIN, RIGHT JOIN ve FULL JOIN uyum içinde


4018
2017-09-01 22:36


Menşei


Aşağıdaki cevaplar, yorumlar ve referansları sadece bir aslında Venn diyagramlarının operatörleri nasıl temsil ettiğini açıklar: Daire kesişim alanı A JOIN B'deki satır kümesini temsil eder. Her daireye özgü alan, A JOIN B'ye katılmayan masasının satırlarını alarak elde ettiğiniz satır kümesini temsil eder. ve tüm tabloya özgü sütunların tümü NULL olarak ayarlandı. (Ve çoğu çevrenin A ve B'ye belirsiz bir uyuşmazlığı verir) - philipxy
Çok fazla cevap verildi, ancak bahsettiğim bu öğretiyi görmedim. Eğer Venn diyagramlarını biliyorsanız, bu BÜYÜK bir öğretici: blog.codinghorror.com/a-visual-explanation-of-sql-joins  Benim için, hızlı bir okuma için yeterince kısa ama yine de tüm kavramı kavramak ve tüm durumlarda çok iyi çalışır. Eğer Venn diyagramlarının ne olduğunu bilmiyorsanız - bunları öğrenin. Bunu yapmak için 5-10 dakika sürer ve setler ile çalışmayı ve setlerdeki işlemleri yönetmek için ihtiyacınız olduğunda yardımcı olur. - DanteTheSmith
@DanteTheSmith Hayır, buradaki diyagramlarla aynı sorunlardan muzdarip. Yukarıdaki yorumlarımı ve aşağıdaki blog mesajını tekrar gözden geçirin: "Jeff blogunu yorumlarda birkaç sayfalık reddediyor". Venn diyagramları setlerdeki elemanları gösterir. Sadece kümelerin ne olduğunu ve bu diyagramlarda elemanların ne olduğunu tanımlamaya çalışın. Takımlar değil tablolar ve elemanlar değil satırları. Ayrıca, iki tablo da birleştirilebilir, bu yüzden PK'ler ve FK'ler geçersizdir. Herşey sahte. Sadece binlerce başka ne yaptığını yapıyorsun - belirsiz izlenim sen (yanlış) üstlenmek mantıklı. - philipxy
Birisi bunu Time Serisi endeksli verilere referans olarak verebilir - İç ve Dış birleşimler, milisaniye cinsinden farklı zaman damgaları söz konusu olduğunda genellikle insan / Venn anlamında çalışmazlar. - yeliabsalohcin
@yeliabsalohcin Bu sayfada yorumlarımı oku (ve cevabım). Yinelenen satır yoksa, Venn diyagramları fark dış ve iç içe geçme birleşimleri arasında, bu nedenle dış birleşimleri gösterir açısından iç birleşmeler ve tersi ne yaptığını biliyorsan. Ama Venn diyagramları yapamaz dış birleştirme ya da iç birleştirme dönüşünü gösterir girdileri bakımından girişlerin çoğaltılmış satırları olmadığında ve aynı sütunlara sahip olmadıkça. (Farklı bir sorunuz varsa, bunu bir soru olarak gönderin. Uygulamalar önemli değil. "" Veri türlerine ve modlarına bağlı olan konular "ile eşleşiyor.) - philipxy


Cevaplar:


Yinelenmeyen sütunlara katıldığınızı varsayarsak, ki bu çok yaygın bir durumdur:

  • A ve B'nin içsel bir birleşimi A'nın kesişen B'nin sonucunu verir, yani bir iç parçanın Venn şeması kesişim.

  • A ve B'nin bir dış birleşimi, bir B birleşmesinin, yani bir Venn diyagramı birliğinin dış kısımlarının sonuçlarını verir.

Örnekler

Her birinde tek bir sütun bulunan iki tablo ve verilerin aşağıdaki gibi olduğunu varsayalım:

A    B
-    -
1    3
2    4
3    5
4    6

Not: (1,2) A'ya özgüdür, (3,4) yaygındır ve (5,6) B'ye özgüdür.

İç birleşim

Eşdeğer sorgulardan birini kullanan bir iç birleştirme, iki tablonun kesişimine, yani ortak olan iki sıraya 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ış katılma

Sol dış birleşim tüm satırları A'ya ve ayrıca B'deki genel satırlara 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ştir

Sağ dış birleşim, tüm satırları B'de ve artı A'daki 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ştirmek

Tam bir dış birleşim size A ve B birleşimini, yani A'daki tüm satırları ve B'deki tüm satırları verecektir. A'daki bir öğenin B'de karşılık gelen bir değeri yoksa B bölümü boştur ve yardımcısı versa.

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

5428
2017-09-01 22:59



Örnek 4 ile tablo B'de başka bir satır ekleyerek örneği büyütmek iyi olacaktır. Bu, iç bağlantıların hiçbir satırda eşit olmaması gerektiğini gösterecektir. - softveda
Ancak bu açıklama mükemmel bir açıklamadır: A ve B'nin bir dış birleşimi, bir B sendikasının, yani bir venn diyagramı birliğinin dış kısımlarının sonuçlarını verir. doğru bir şekilde ifade edilmez. Bir dış birleşim, aşağıdakilerden birine ek olarak A'nın kesiştiği B'nin sonuçlarını verir: A'nın tümü (soldaki), tüm B (sağdaki birleştirmeler) veya A'nın tamamı ve B'nin tümü (tam birleştirme). Sadece bu son senaryo gerçekten bir sendika B'dir. Yine de iyi yazılmış bir açıklama. - Thomas
Pro cevap! Beğendim. Btw: Hala LEFT JOIN ve LEFT OUTER JOIN, vs betweek farklarını bulamıyorum. Bu sorunun bir parçası değilse yeni bir tane gönderebilirim :) - YvesR
TAM JOIN FULL OUTER JOIN'in bir takma adı ve LEFT JOIN, SOL OUTER JOIN'ın bir takma adı mı? - Damian
@Ameer, teşekkürler. Katılma, bir siparişi garanti etmez, bir ORDER BY yan tümcesi eklemeniz gerekir. - Mark Harrison


Ayrıca farklı birleştirme türleri için aşağıdaki şemayı göz önünde bulundurabilirsiniz;

visual explanation of joins

Kaynak: Görsel-Temsil-of-SQL-Katıldı ayrıntılı olarak açıkladı C.l. Moffatt


2443
2018-05-16 23:03



Not: MySQL'de FULL OUTER JOIN yok. stackoverflow.com/questions/12473210/... - Michael Ozeryansky
Bence bu şemada çoğunun olmadığı varsayılmaktadır. Keyanlamı Key benzersiz. Eğer Key benzersiz değildi, sonuç bir çarpı olurdu ve dönüş sayısı A'nın boyutundan çok daha yüksek olurdu. - AlikElzin-kilaka
FULL OUTER JOIN örneğinde, kesişme noktası hariç tutulduğunda, 'A.Key IS NULL' ifadesi kullanılmayacaktır, çünkü tüm satırlar A'dan hariç tutulur, çünkü Anahtar NULL ise, satır satır mevcut değil midir? Bu mekanizmanın gösterilen VENN diyagramı için sonuçları nasıl başardığını görmüyorum. - Kelly S. French
@ KellyS.French Venn diyagramlarının nasıl okunacağını açıklayan soru ve diğer cevaplar hakkındaki yorumlarımı görün. Bölgeler A & B tablolarındaki satırları kapsamaz. Satırları A'dan ve B satırından eşleştirmeden yapılan belirli satırları kapsar. Bu, SELECT ifadesinin çıktısının satırları bile değildir. Venn diyagramı cevapları zayıf. - philipxy
A hepsini temsil eder potansiyel tableA gelen satırlar, B hepsini temsil eder potansiyel tableB'den gelen satırlar. Diyagramdaki kırmızı bölgeler, bu satırlardan hangisinin sonuç kümesine dahil edileceğini gösterir. Çok fazla ve daha fazlası olabileceğini unutmayın. potansiyel Tablodan gelen satırlar, o tabloda aslında satırlardır. Çünkü TableA’daki herhangi bir satır potansiyel TabloB'de her satır için bir kez oluşur. Bu denir Kartezyen ürün. - Stijn de Witt


Ben tavsiye ediyorum Jeff'in blog yazısı. Gördüğüm en iyi tanım, artı görselleştirme var, ör .:

İç birleşim:

enter image description here

Tam dış birleştirmek:

enter image description here


591
2017-08-30 11:52



Bu diyagram, kavram için biraz yanıltıcıdır. Mesajdaki yorumları da okuyun. - softveda
@ ya23: Tam dış katılımla ne demek istiyorsun? - ursitesion
Jeff dışında tanımaz blogunda şu yorumlarda birkaç sayfa var: "Yorumlayıcılar, diyagramların birden fazla ve iki kez sonuçlanması durumunda bozulduğuna işaret ederek, kesinlikle doğru. Aslında, birincil anahtarla birleşiyordum. Tanım, örnekler bu şekilde ifade edilmemesine rağmen, kartezyen veya çapraz ürün gibi, başlangıçta başladığınızdan daha fazla satırla sonuçlanan her şey, tüm venn diyagramı kavramını kesinlikle bozar. - philipxy
@philipxy evet Venn diyagramı benzetimi sadece NULLs göz ardı ettikten sonra birincil anahtar için çalışır - bu genellikle belirtilmez. Venn diyagramları, sonuç kümesindeki diğer sütunların NULL'lerle nasıl doldurulduğunu açıklamaya yardımcı olmaz. - Galax
@Galax Maalesef, birleştirmeler anahtarlarda olsun (sadece birincil anahtarlar), diyagramların anlamlandırmasına yardımcı olmaz. (Jeff'in alıntı yaptığını söylediğini söylesem de) ("NULL'ları görmezden geldikten sonra" birincil anahtarın çalışmalarını "veya" sonuçtaki kümedeki diğer sütunların NULL'lerle dolu olduğunu "anlamıyorum). daha az çeşit Söylemeye çalıştığınız şeyden, fakat yazışmamdaki herhangi bir yazışmadan ancak karmaşık ve böylece açık açıklama. Bir tane de hoş karşılansam da. Kesinlikle ne gruplandırılıyor Nasıl çevreler tarafından? - philipxy


Venn diyagramları benim için bunu gerçekten yapmıyor.

Örneğin, bir çapraz birleştirmeyle bir iç birleştirme arasında herhangi bir ayrım göstermezler, ya da daha genel olarak farklı katılım yüklemeleri türleri arasında herhangi bir ayrım gösterirler veya nasıl çalışacaklarına dair bir çerçeve sağlarlar.

Mantıksal işlemeyi anlamak için hiçbir ikame yoktur ve zaten kavramak nispeten kolaydır.

  1. Çapraz birleştirmeyi düşünün.
  2. Değerlendir on 1. adımdaki tüm satırlara karşı, yüklemenin değerlendirildiği yerleri koruyarak true
  3. (Sadece dış birleştirmeler için) 2. adımda kaybolan tüm dış sıralara geri ekleyin.

(Not: Uygulamada, sorgu iyileştiricisi, yukarıdaki mantıksal açıklamanın dışında sorguyu yürütmenin daha etkili yollarını bulabilir, ancak nihai sonuç aynı olmalıdır)

Animasyonlu bir versiyonu ile başlayacağım tam dış birleştirme. Daha fazla açıklama izler.

enter image description here


açıklama

Kaynak Tabloları

enter link description here

İlk önce bir CROSS JOIN (AKA Kartezyen Ürün). Bu bir yok ON yan tümce ve iki tablodan her satır birleşimini döndürür.

SELECT A.Colour, B. A CROSS JOIN B'DEN

enter link description here

İç ve Dış birleşimler bir "ON" cümlesi yüklemi var.

  • İç birleşim. Çapraz ekleme sonucundaki tüm satırlar için "ON" deyimindeki koşulu değerlendirin. Doğruysa, birleştirilen satırı döndürür. Aksi takdirde atın.
  • Sol dış katılma. Daha sonra iç birleştirmeyle aynıdır, sol tablodaki herhangi bir satırla eşleşmeyen herhangi bir satır için bunları doğru tablo sütunları için NULL değerleri ile çıktı.
  • Sağ Dış Katıl. İç tablo ile aynı, sağ tablodaki herhangi bir satırla eşleşmeyen herhangi bir satır için bunları sol tablo sütunları için NULL değerleri ile çıktı.
  • Tam Dış Katıl. İç birleştirmeyle aynı şekilde, sol dış birleştirmede olduğu gibi sol eşleştirilmemiş satırları ve sağ dış birleştirmeye göre doğru eşleşmeyen satırları koru.

Bazı örnekler

SELECT A.Colour, B.BUYA BİR İÇERİKDEN BİÇİNDEN A.Colour = B.Colour

Yukarıdaki klasik equi birleşimidir.

Inner Join

Animasyonlu Sürüm

enter image description here

SELECT A.Colour, B.BUYA BİR İÇERİKDEN BİÇİNDEN DÜŞÜNMEKTÜR A.Colour NOT IN ('Yeşil', 'Mavi')

İç katılma koşulu mutlaka bir eşitlik koşulu olmak zorunda değildir ve tabloların her ikisinden (veya hatta her ikisinden) referans sütunlara ihtiyaç duymaz. değerlendirilmesi A.Colour NOT IN ('Green','Blue') çapraz birleştirmenin her satırında döner.

inner 2

SELECT A.Colour, B. BİR İÇERİK BİNADAN DAHA FAZLA 1 = 1

Birleştirme koşulu, çapraz katılma sonucundaki tüm satırlar için doğru olarak değerlendirilir; dolayısıyla bu, bir çapraz birleştirmeyle aynıdır. Tekrar 16 satırın resmini tekrarlamayacağım.

SELECT A.Colour, B.COMour A LEFT OUT JOIN B'DEN ALINIZ. Colour = B.Colour

Dış Bağlantılar, iç birleştirmelerle aynı şekilde mantıksal olarak değerlendirilir, ancak sol tablodan bir satır (sol birleştirme için) sağdaki tablodaki herhangi bir satır ile birleşmezse sonuçta korunur; NULL sağ sütunlar için değerler.

LOJ

SELECT A.Colour, B.COMour A LEFT OUTER JOIN B'NDEN ALINIZ. Colour = B.Colour WHERE B.Colour IS NULL

Bu, önceki sonucu yalnızca satırları yalnızca geri döndürmek için kısıtlar B.Colour IS NULL. Bu özel durumda, bunlar, sağ el tablosunda hiçbir eşleşme bulunmayan korunmuş satırlar olacak ve sorgu, tabloda eşleşmeyen tek kırmızı satırı döndürecektir. B. Bu anti yarı birleşme olarak bilinir.

İçin bir sütun seçmek önemlidir IS NULL NULL olmayan ya da birleştirme koşulunun herhangi bir NULL Bu şablonun düzgün çalışması için sıralar hariç tutulacak ve sadece NULL Eşleşmeyen satırlara ek olarak bu sütun için değer.

loj is null

SELECT A.Colour, B. Bir DOĞRU OUTER JOIN B'DEN ALINIZ .Colour = B.Colour

Sağ dış birleştirmeler, sol tablodaki eşleşmeyen satırları koruduğu ve soldaki sütunları boş bırakmaları dışında, sol dış bağlantılara benzer şekilde davranır.

ROJ

SELECT A.Colour, B.COMUR A FULL OUTER JOIN B'DEN AÇIN .Colour = B.Colour

Tam dış birleşimler, sol ve sağ birleşimlerin davranışını birleştirir ve eşleşen olmayan satırları hem sol hem de sağ tablolardan korur.

FOJ

SELECT A.Colour, B. FULL OUTER JOIN B'DEN DAHA FAZLA 1 = 0

Çapraz birleştirmede hiçbir satır eşleşmiyor 1=0 yüklem. Her iki taraftaki tüm satırlar, diğer taraftaki tablonun sütunlarında NULL ile normal dış birleştirme kuralları kullanılarak korunur.

FOJ 2

COALESCE SEÇİN (A.Colour, B.Colour) AS TAM BİR FREN BİÇİMİNDEN BİÇİMLENDİRİN B 1 = 0

Küçük bir sorgu ile önceki sorguda değişiklik yapılabilir. UNION ALL iki tablodan.

UNION ALL

SELECT A.Colour, B.COMour A LEFT OUTER JOIN B'NDEN ALINIZ. Colour = B.Colour WHERE B.Colour = 'Green'

Unutmayın ki WHERE cümlesi (varsa), birleştirmeden sonra mantıksal olarak çalışır. Yaygın bir hata, sol bir dış birleştirmenin gerçekleştirilmesi ve daha sonra, sağdaki tabloda, eşleşen olmayan satırlar hariç olmak üzere biten bir koşul bulunan bir WHERE yan tümcesi içermesidir. Yukarıdaki dış birleştirmeyi gerçekleştiriyor ...

LOJ

... Ve sonra "Nerede" cümlesi çalışır. NULL= 'Green' doğruyu değerlendirmez, böylece dış birleştirme tarafından korunan satır atılır (maviyle birlikte), birleştirme işlemini etkili bir şekilde bir iç kısma dönüştürür.

LOJtoInner 

Niyet, yalnızca Yeşil'in bulunduğu B satırlarını ve doğru bir sözdizimine bakılmaksızın A'nın tüm satırlarını içermekti.

SELECT A.Colour, B.COMour A LEFT OUTER JOIN B'DEN DEKORUN A.Colour = B.Colour AND B.Colour = 'Green'

enter image description here

SQL Fiddle

Bu örneklere bakın SQLFiddle.com'da canlı yayınla.


529
2017-12-13 11:58



Bu benim için neredeyse Venn diyagramları kadar işe yaramazken, insanların farklılaştığını ve farklı bir şekilde öğrenmekte olduklarını takdir ediyorum ve bu, daha önce gördüğümden farklı olarak çok iyi sunulan bir açıklamadır, dolayısıyla @ypercube'yi destekliyorum. Bonus puanları verilir. Ayrıca JOIN yan tümcesinde WHERE yan tümcesine ek koşullar koyma farkını açıklayan iyi bir çalışma. Kudos sana, Martin Smith. - Old Pro
@OldPro Venn şemaları her ne kadar ileri gittikleri kadar iyi, ancak çapraz birleştirme işlemini nasıl temsil edecekleri konusunda sessizdirler ya da bir tür katılımı diğerlerinden eşitlemek gibi bir katılım katılımını birbirinden ayırırlar. Birleştirmeyi değerlendirmenin zihinsel modeli, çapraz katılma sonucunun her bir satırına yüklendikten sonra, bir dış birleştirme ve nihayetinde benim için hangisinin daha iyi çalıştığını değerlendirirse, eşsiz sıralara geri ekleme yapar. - Martin Smith
Venn diyagramları, Birlik ve Kesişme ve Farklılıkları temsil etmek için iyi ama katılmazlar. Çok basit birleşimler için biraz eğitimsel değere sahiptirler, yani birleştirme koşulu benzersiz sütunlarda birleşir. - ypercubeᵀᴹ
@Arth - Hayır, yanılıyorsun. SQL Fiddle sqlfiddle.com/#!3/9eecb7db59d16c80417c72d1/5155 Bu Venn diyagramlarının gösteremediği bir şey. - Martin Smith
@MartinSmith Vay, katılıyorum, tamamen hatalıyım! Bire-manys ile çalışmak için çok kullanılan .. Düzeltme için teşekkürler. - Arth


Aşağıdaki yazıdan alınmıştır "MySQL - SOL JOIN ve DOĞRU BİRLEŞTİRİLMİŞ, İÇ KATLI VE DIŞ KATLI"Graham Ellis’in blogu Horse's Mouth’da.

MySQL gibi bir veritabanında, veri daha sonra bağlı olan bir dizi tabloya bölünür (Joined) tarafından birlikte JOIN içinde SELECT Birden çok tablodan kayıtları okumak için komutlar. Nasıl çalıştığını görmek için bu örneği okuyun.

İlk olarak, bazı örnek veriler:

people
    mysql> select * from people;
    +------------+--------------+------+
    | name       | phone        | pid  |
    +------------+--------------+------+
    | Mr Brown   | 01225 708225 |    1 |
    | Miss Smith | 01225 899360 |    2 |
    | Mr Pullen  | 01380 724040 |    3 |
    +------------+--------------+------+
    3 rows in set (0.00 sec)

property
    mysql> select * from property;
    +------+------+----------------------+
    | pid  | spid | selling              |
    +------+------+----------------------+
    |    1 |    1 | Old House Farm       |
    |    3 |    2 | The Willows          |
    |    3 |    3 | Tall Trees           |
    |    3 |    4 | The Melksham Florist |
    |    4 |    5 | Dun Roamin           |
    +------+------+----------------------+
    5 rows in set (0.00 sec)

DÜZENLİ KATI

Düzenli bir JOIN yaparsak (INNER, OUTER, LEFT veya RIGHT anahtar sözcüklerinin hiçbiri ile), iki tablodaki uygun şekilde eşleşen tüm kayıtları alırız ve eşleşmeyen gelen tablolarda kayıtlar raporlanmaz. :

mysql> select name, phone, selling 
from people join property 
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name      | phone        | selling              |
+-----------+--------------+----------------------+
| Mr Brown  | 01225 708225 | Old House Farm       |
| Mr Pullen | 01380 724040 | The Willows          |
| Mr Pullen | 01380 724040 | Tall Trees           |
| Mr Pullen | 01380 724040 | The Melksham Florist |
+-----------+--------------+----------------------+
4 rows in set (0.01 sec)

SOL YÖNDEN KATILIM

LEFT JOIN yaparsak, aynı şekilde eşleşen tüm kayıtları alırız ve İLAVE katılımın sol tablosundaki her bir eşleşmemiş kayıt için ekstra bir kayıt elde ederiz - böylece (bu örnekte) her bir PERSONU'nun sözünü :

   mysql> select name, phone, selling 
    from people left join property 
    on people.pid = property.pid; 
    +------------+--------------+----------------------+
    | name       | phone        | selling              |
    +------------+--------------+----------------------+
    | Mr Brown   | 01225 708225 | Old House Farm       |
    | Miss Smith | 01225 899360 | NULL <<-- unmatch    |
    | Mr Pullen  | 01380 724040 | The Willows          |
    | Mr Pullen  | 01380 724040 | Tall Trees           |
    | Mr Pullen  | 01380 724040 | The Melksham Florist |
    +------------+--------------+----------------------+
    5 rows in set (0.00 sec)

SAĞ JOIN

DOĞRU BİR YAZIYI yaparsak, eşleşen tüm kayıtları ve EK ADRESİ, birleşimin sağ tablosundaki her bir eşleşmemiş kayıt için ek bir kayıt alırız - benim örneğimizde satıcı detayları var:

mysql> select name, phone, selling 
from people right join property 
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name      | phone        | selling              |
+-----------+--------------+----------------------+
| Mr Brown  | 01225 708225 | Old House Farm       |
| Mr Pullen | 01380 724040 | The Willows          |
| Mr Pullen | 01380 724040 | Tall Trees           |
| Mr Pullen | 01380 724040 | The Melksham Florist |
| NULL      | NULL         | Dun Roamin           |
+-----------+--------------+----------------------+
5 rows in set (0.00 sec)

INNER JOIN, ilk örnekte olduğu gibi tam bir birleştirme yapar ve OUTER kelimesi son iki örnekte SOL veya SAĞ kelimesinden sonra eklenebilir - ODBC uyumluluğu için sağlanır ve ek özellikler eklemez.


291
2018-02-14 05:53



REGULAR JOIN ve INNER JOIN aynı şey. Graham Ellis, whit demek istedi REGULAR hiçbiri ne zaman INNER JOIN "varsayılan" JOIN olduğunu LEFT veya RIGHT anahtar kelimeler belirtildi. Eğer bütün yazıyı okursanız, sonunda "Bir İÇERİK KATILIM, ilk örnekte olduğu gibi tam bir birleşme yapar ve son iki örnekte DIŞ veya SAĞ kelimesinden sonra DIŞ sözcüğü eklenebilir" - ODBC için sağlanır uyumluluk ve ekstra yetenekler eklemez. " - vegatripy
Şaşkın olanlar için pid ve spid, pid "kişi kimliği" anlamına gelir ve spid "emlak mülk kimliği" anlamına gelir. - Andrew Grimm
Ya sadece Bay.BROWN, Bayan SMITH ve Bay Pullen'ı seçmek istiyorsak? - Fortune
@Fortune Seçiniz (satır sayısı name bunlardan birine eşit? Bu, iç ve dış birleşimler arasındaki farkla nasıl ilişkilidir? - philipxy
birçok cevap bir - çokluk durumu hakkında düşünmeyin this ve bu birisini yanıltacak, cevabınız daha iyi! - rocket1037


İç birleşim

Yalnızca eşleşen satırları al, yani A intersect B.

Enter image description here

SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Sol dış katılma

İlk tablodaki tüm kayıtları ve ikinci kayıttaki tüm kayıtları seçin. birleştirilen anahtarlarla eşleşen tablo.

Enter image description here

SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Tam Dış Katılma

İkinci tablodaki tüm kayıtları ve ilk önce tüm kayıtları seçin. birleştirilen anahtarlarla eşleşen tablo.

Enter image description here

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Referanslar


114
2018-01-27 12:16



Aletin adı nedir? Satırların sayısını ve venn şemalarını gösterdiği için ilginç buluyorum - Grijesh Chauhan
@GrijeshChauhan Datamartist :) - Tushar Gupta
@Trushar :( Linux sistemi için değil .. - Grijesh Chauhan
@GrijeshChauhan Evet Ama kullanarak çalıştırmak için deneyebilirsiniz şarap . - Tushar Gupta
Ohh! evet ben .. ..Şarap kullanarak SQLyog kullandım .. ayrıca PlayOnLinux - Grijesh Chauhan


Katıldı verileri iki tablodan birleştirmek için kullanılır, sonuçta yeni, geçici bir tablo olur. Katılımlar, bir katılımı gerçekleştirmek için kullanılacak koşulu belirleyen, yüklem adı verilen bir şeye göre yapılır. Bir iç birleştirme ve bir dış birleştirmenin arasındaki fark, bir iç birleştirmenin yalnızca birleştirme yüklemesine dayalı olarak eşleşen satırları döndürmesidir. Çalışan ve Yer tablosunu düşünelim:

enter image description here

İç birleşim:- İç birleştir, iki tablonun sütun değerlerini birleştirerek yeni bir sonuç tablosu oluşturur (işçi ve yer) birleştirme-yüklemine dayalı. Sorgu her satırı karşılaştırır işçi her sıra ile yer Birleştirme-yüklemini tatmin eden tüm satır çiftlerini bulmak için. Birleştirme-yüklemesi, NULL olmayan değerleri eşleştirerek memnun olduğunda, her eşleşen satır çiftinin sütun değerleri işçi ve yer bir sonuç satırında birleştirilir. Bir iç birleştirme için SQL şöyle görünecektir:

select  * from employee inner join location on employee.empID = location.empID
OR
select  * from employee, location where employee.empID = location.empID

Şimdi, SQL'in çalışmasının sonucu aşağıdaki gibi görünüyor: enter image description here enter image description here

Dış Katılmak: - Bir dış birleştirme, birleşik bir kaydın olması için birleştirilmiş iki tablodaki her kaydı gerektirmez. Birleştirilen tablo, diğer kayıtlar olmasa bile her kaydı saklar. Dış birleştirmeler, hangi tablonun satırlarının tutulduğuna (sol veya sağ) bağlı olarak daha sol dış birleşimlere ve sağ dış birleşimlere daha da bölünür.

Sol dış katılma:- Tablolar için sol dış birleştirmenin (veya sadece sol birleştirmenin) sonucu işçi ve yer her zaman "sol" tablonun tüm kayıtlarını içerir (işçi), birleştirme koşulu "doğru" tabloda herhangi bir eşleşen kayıt bulamıyor olsa bile (yer). Yukarıdaki tabloları kullanarak, sol dış birleşim için SQL'in nasıl görüneceği aşağıda açıklanmıştır:

select  * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional

Şimdi, bu SQL'in çalışmasının sonucu şöyle görünecektir: enter image description here enter image description here

Sağ Dış Katılmak: - Sağ dış birleşim (veya sağ birleştirme), tabloların tersine çevrilmesi dışında, bir sol dış birleştirmeye çok benzer. "Doğru" tablodan her satır (yer) birleştirilmiş tabloda en az bir kez görünecektir. "Sol" tablodan eşleşen satır yoksa (işçi) var, NULL gelen sütunlarda görünecek işçi eşleşme olmayan kayıtlar için yer. SQL böyle görünüyor:

select * from employee right outer join location  on employee.empID = location.empID;
//Use of outer keyword is optional

Yukarıdaki tabloları kullanarak, sağ dış birleşim sonucunun neye benzeyeceğini gösterebiliriz:

enter image description hereenter image description here

Tam Dış Bağlantılar: - Tam Dış Katılma veya Tam Katılma, birleştirme sonucundaki eşleşmeyen satırları dahil ederek eşleşmeyen bilgileri korumaktır, tam bir dış birleştirmeyi kullanın. Diğer tablonun eşleşen bir değere sahip olup olmadığına bakılmaksızın, her iki tablodaki tüm satırları içerir. enter image description here

Görüntü kaynağı

MySQL 8.0 Referans El Kitabı - Sözdizime Katılın

Oracle Üyelik işlemleri


108
2017-12-18 06:54





Basit kelimelerle:

bir iç birleşim Yalnızca eşleşen satırları al.

Oysa dış birleştirme Eşleşen satırları bir tablodan ve diğer satırlardaki tüm satırlardan al ... sonuç hangisini kullandığınıza bağlıdır:

  • Ayrıldı: Sağ tablodaki eşleşen satırlar ve soldaki tablodaki tüm satırlar

  • Sağ: Sol tablodaki eşleşen satırlar ve sağdaki tablodaki tüm satırlar veya

  • Tam: Tüm tablolardaki tüm satırlar. Bir eşleşme olup olmadığı önemli değil


101
2018-01-12 11:07



@nomen Bu cevap adrese değil, INNER JOIN bir kesişim noktasıdır ve FULL OUTER JOIN ilgili UNION'dur Eğer sol ve sağ kümeler / daireler (sırasıyla) SOL ve SAĞ birleştirmenin satırlarını içerir. PS Bu cevap, girdi ve çıktıdaki satırlar hakkında belirsizdir. "Sol / sağ tabloda" sol / sağdaki "ile karıştırır ve diğer tablodaki satırın null tarafından sırasına göre genişletilmiş satırı anlamına gelen" eşleştirilen satır "ile" hepsi "arasındaki farkı kullanır. - philipxy


Bir iç birleştirme, birleştirmenin diğer (sağ) tarafında eşleşen bir kayıt varsa, yalnızca satırlar gösterir.

Bir (sol) dış birleşim, birleştirmenin diğer (sağ) tarafında eşleşen satır olmasa bile, sol taraftaki her kayıt için satır gösterir. Eşleşen satır yoksa, diğer (sağ) tarafın sütunları NULLs gösterir.


92
2017-09-01 22:38





İç birleştirmeler, birleşik tabloda bir ilgili kimliğe sahip bir kaydın var olmasını gerektirir.

Dış katılımlar, sağ taraf için hiçbir şey bulunmasa bile, sol taraftaki kayıtları geri gönderir.

Örneğin, bir Siparişleriniz ve bir OrderDetails tablosu var. Bir "OrderID" ile ilişkilidir.

Emirler

  • Sipariş Kimliği
  • Müşteri adı

Sipariş detayları

  • OrderDetailID
  • Sipariş Kimliği
  • Ürün adı
  • Adet
  • Fiyat

Talep

SELECT Orders.OrderID, Orders.CustomerName FROM Orders 
INNER JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID

Sadece OrderDetails tablosunda bir şeyleri olan Emirleri iade edecektir.

Eğer onu OUTER SOL JOIN olarak değiştirirseniz

SELECT Orders.OrderID, Orders.CustomerName FROM Orders 
LEFT JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID

Daha sonra hiçbir OrderDetails kaydı olmasa bile Siparişler tablosundan kayıtları döndürecektir.

Herhangi bir where cümlesi ekleyerek olası bir artık siparişini belirten herhangi bir OrderDetails bulunmayan Siparişler bulmak için bunu kullanabilirsiniz WHERE OrderDetails.OrderID IS NULL.


67
2017-09-01 22:47



Basit ama gerçekçi örneği takdir ediyorum. Gibi bir istek değiştirdim SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c, categories_description cd WHERE c.id = cd.categories_id AND c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC için SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c INNER JOIN categories_description cd ON c.id = cd.categories_id WHERE c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC Başarı ile (MySQL). Ek koşullar hakkında emin değildim, iyi karıştılar ... - PhiLho


Basit kelimelerle:

İç birleşim -> Ebeveyn ve çocuk masalarından SADECE ortak kayıtlar alın. Tablodaki ana anahtar, Çocuk masasında Yabancı anahtarla eşleşir.

Sol yönden katılım ->

sözde kod

1.Take All records from left Table
2.for(each record in right table,) {
    if(Records from left & right table matching on primary & foreign key){
       use their values as it is as result of join at the right side for 2nd table.
    } else {
       put value NULL values in that particular record as result of join at the right side for 2nd table.
    }
  }

Sağ katıl : Sol birleştirmenin tam tersi. Sağ katılma sırasında sağ taraftaki LEFT JOIN'de tablonun adını yazınız, LEFT JOIN ile aynı çıktıyı elde edersiniz.

Dış birleştirme : Her iki tablodaki tüm kayıtları göster No matter what. Sol tablodaki kayıtlar Primary, Forieign anahtarına göre doğru tabloyla eşleşmiyorsa, birleştirmenin sonucu olarak NULL değerini kullanın.

Örnek :

Example

2 tablo için şimdi kabul edelim

1.employees , 2.phone_numbers_employees

employees : id , name 

phone_numbers_employees : id , phone_num , emp_id   

Burada, çalışanlar masası Ana masa, phone_numbers_employees çocuk masası (içeriyor emp_id bağlayan yabancı anahtar olarak employee.id bu yüzden çocuk masası.)

İç birleştirmeler 

2 tablo kayıtlarını alın YALNIZCA Çalışanlar tablosunun birincil anahtarı (kimlik numarası) Çocuk masası telefon_numbers_employees (emp_id) Yabancı anahtar eşleşir.

Yani sorgu şöyle olurdu:

SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Burada sadece yukarıda açıklandığı gibi birincil anahtar = yabancı anahtarla eşleşen satırları alın. Birleştirme sonucunda birincil anahtardaki = eşleşen olmayan eşleşen satırlar atlanır.

Sol birleşimler :

Soldaki birleşim, sağdaki tabloda eşleşen bir satır olup olmadığına bakılmaksızın, sol tablonun tüm satırlarını korur.

SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Dış birleşme :

SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Diyagramatik olarak şöyle görünür:

Diagram


58
2018-02-19 04:50



Sonuç, birincil / benzersiz / aday anahtarlar ve yabancı anahtarlarla hiçbir şey yapmaz. Bu baviour, onlara referans olmadan açıklanabilir ve tanımlanmalıdır. Çapraz birleştirme hesaplanır, daha sonra ON koşuluna uymayan satırlar filtrelenir; ek olarak dış birleşme satırları için filtrelenmiş / eşleşmeyen satırlar NULL'lar (LEFT / RIGHT / FULL ve dahil) tarafından genişletilir. - philipxy