Apa perbedaan antara "INNER JOIN &" dan "OUTER JOIN &"?
Juga bagaimana LEFT JOIN
, RIGHT JOIN
dan FULL JOIN
cocok?
4488
20
Juga bagaimana LEFT JOIN
, RIGHT JOIN
dan FULL JOIN
cocok?
Dengan asumsi Anda bergabung pada kolom tanpa duplikat, yang merupakan kasus yang sangat umum:
Sebuah inner join dari A dan B memberikan hasil dari A berpotongan dengan B, yaitu bagian dalam dari perpotongan diagram Venn.
Sebuah outer join dari A dan B memberikan hasil dari A union B, yaitu bagian luar dari union diagram Venn.
Contoh
Misalkan Anda memiliki dua tabel, dengan masing-masing satu kolom, dan data sebagai berikut:
Perhatikan bahwa (1,2) adalah unik untuk A, (3,4) adalah umum, dan (5,6) adalah unik untuk B.
Gabungan dalam
Inner join menggunakan salah satu dari kueri yang setara memberikan perpotongan dari dua tabel, yaitu dua baris yang mereka miliki bersama.
Gabungan luar kiri
Gabungan luar kiri akan memberikan semua baris di A, ditambah baris yang sama di B.
Gabungan luar kanan
Gabungan luar kanan akan memberikan semua baris di B, ditambah baris yang sama di A.
Gabungan luar penuh
Gabungan luar penuh akan memberi Anda gabungan A dan B, yaitu semua baris di A dan semua baris di B. Jika sesuatu di A tidak memiliki datum yang sesuai di B, maka bagian B adalah null, dan sebaliknya.
Dalam diagram Venn don't benar-benar melakukannya untuk saya. Mereka don't menunjukkan ada perbedaan antara cross join dan inner join, misalnya, atau lebih umumnya menunjukkan adanya perbedaan antara yang berbeda jenis bergabung dengan predikat atau menyediakan kerangka kerja untuk penalaran tentang bagaimana mereka akan beroperasi. Tidak ada pengganti untuk memahami pengolahan logis dan hal ini relatif mudah untuk memahami pula.
on
klausul terhadap semua baris dari langkah 1 menjaga mereka di mana predikat mengevaluasi untukbenar
Penjelasan
Sumber Tabel
Pertama mulai dengan
Dalam dan Luar bergabung memiliki "ON" klausul predikat.
CROSS JOIN
(ALIAS Cartesian Product). Ini tidak memilikiPADA
klausul dan hanya kembali setiap kombinasi dari baris dari dua tabel. A. PILIH Warna, B. Warna DARI SALIB BERGABUNG BBeberapa contoh
A. PILIH Warna, B. Warna DARI INNER JOIN B ON A. Warna = B. Warna Di atas adalah klasik equi join.
Versi Animasi##
A. PILIH Warna, B. Warna DARI INNER JOIN B ON A. Warna TIDAK DI ('Hijau','Biru')
Dalam kondisi join tidak perlu kesetaraan dan kondisi itu tidak perlu referensi dari kolom kedua (atau bahkan keduanya) dari tabel. Mengevaluasi
A. PILIH Warna, B. Warna DARI INNER JOIN B ON 1 =1
Kondisi join mengevaluasi ke true untuk semua baris di kayu salib bergabung hasilnya jadi ini adalah sama seperti salib bergabung. Saya tidak't mengulang gambar dari 16 baris lagi.
A. Warna TIDAK DI ('Hijau','Biru')
pada setiap baris dari salib bergabung kembali.A. PILIH Warna, B. Warna DARI LEFT OUTER JOIN B ON A. Warna = B. Warna
Luar Bergabung logis dievaluasi dengan cara yang sama seperti dalam bergabung kecuali bahwa jika sebuah baris dari tabel kiri (kiri bergabung) tidak bergabung dengan setiap baris dari tangan kanan tabel pada semua hal yang diawetkan dalam hasil dengan
NULL
nilai-nilai untuk tangan kanan kolom.A. PILIH Warna, B. Warna DARI LEFT OUTER JOIN B ON A. Warna = B. Warna di MANA B. Warna ADALAH NULL
Ini hanya membatasi hasil sebelumnya hanya menampilkan baris-baris mana
B. Warna NULL
. Dalam kasus ini, ini akan menjadi baris yang diawetkan karena mereka tidak memiliki pertandingan di tangan kanan tabel dan query mengembalikan tunggal merah-turut tidak cocok dalam tabelB
. Hal ini dikenal sebagai anti semi bergabung. Hal ini penting untuk memilih kolom untukNULL
tes yang baik tidak nullable atau untuk yang kondisi join memastikan bahwa setiapNULL
nilai-nilai yang akan dikeluarkan dalam rangka untuk pola ini untuk bekerja dengan benar dan menghindari hanya membawa kembali baris yang terjadi untuk memilikiNULL
nilai untuk kolom tersebut selain untuk pbb dicocokkan baris.A. PILIH Warna, B. Warna DARI RIGHT OUTER JOIN B ON A. Warna = B. Warna
Right outer join bertindak demikian pula left outer join kecuali mereka melestarikan non-baris yang cocok dari tabel kanan dan null memperpanjang tangan kiri kolom.
A. PILIH Warna, B. Warna DARI FULL OUTER JOIN B ON A. Warna = B. Warna
Full outer join menggabungkan perilaku kiri dan kanan bergabung dan melestarikan non-baris yang cocok dari kedua sisi kiri dan kanan tabel.
A. PILIH Warna, B. Warna DARI FULL OUTER JOIN B ON 1 = 0
Tidak ada baris di kayu salib bergabung match
1=0
predikat. Semua baris dari kedua belah pihak yang diawetkan menggunakan normal outer join aturan dengan NULL dalam kolom dari tabel di sisi lain.PILIH MENYATU(A. Warna, B. Warna) SEBAGAI Warna DARI FULL OUTER JOIN B ON 1 = 0
Dengan minor mengubah untuk permintaan sebelumnya yang bisa mensimulasikan
UNION ALL
dari dua tabel.A. PILIH Warna, B. Warna DARI LEFT OUTER JOIN B ON A. Warna = B. Warna di MANA B. Warna = 'Hijau'
Perhatikan bahwa
... Dan kemudian "Tempat" klausul berjalan.
Jika tujuannya adalah untuk hanya menyertakan baris dari B di mana Warna Hijau dan semua baris dari terlepas sintaks yang benar akan
WHERE
(jika ada) secara logis berjalan setelah bergabung. Salah satu kesalahan umum adalah untuk melakukan left outer join dan kemudian mencakup klausul MANA dengan kondisi pada tabel kanan yang berakhir tidak termasuk non-baris yang cocok. Di atas berakhir melakukan outer join...NULL= 'Hijau'
tidak mengevaluasi dengan benar sehingga turut dilestarikan oleh outer join berakhir dibuang (bersama dengan satu biru) secara efektif mengubah bergabung kembali ke dalam satu.A. PILIH Warna, B. Warna DARI LEFT OUTER JOIN B ON A. Warna = B. Warna DAN B. Warna = 'Hijau'
SQL Biola
Melihat contoh-contoh ini run live di SQLFiddle.com.
Bergabung digunakan untuk menggabungkan data dari dua tabel, dengan hasil yang baru, sementara meja. Bergabung dilakukan berdasarkan pada sesuatu yang disebut predikat, yang menentukan kondisi untuk digunakan dalam rangka untuk melakukan join. Perbedaan antara inner join dan outer join adalah bahwa inner join akan kembali hanya baris yang benar-benar sesuai berdasarkan bergabung predikat. Untuk eg - Memungkinkan mempertimbangkan Karyawan dan Lokasi meja:
Inner Join:- Inner join menciptakan baru hasil tabel dengan menggabungkan nilai-nilai kolom dari dua tabel (Karyawan dan Lokasi) berdasarkan bergabung-predikat. Query membandingkan setiap baris Karyawan dengan setiap baris Lokasi untuk menemukan semua pasangan baris yang memenuhi bergabung-predikat. Ketika bergabung-predikat puas dengan mencocokkan nilai non-NULL, kolom nilai untuk setiap pasangan yang cocok dari baris Karyawan dan Lokasi digabungkan menjadi hasil-turut. Berikut SQL untuk bergabung batin akan terlihat seperti:
Sekarang, di sini adalah apa hasil dari menjalankan SQL yang akan terlihat seperti:
Outer Join:- Luar bergabung tidak memerlukan setiap record dalam dua bergabung tabel untuk memiliki catatan yang cocok. Bergabung meja mempertahankan catatan masing-masing—bahkan jika tidak ada yang cocok record yang ada. Luar bergabung membagi lebih lanjut menjadi left outer join dan right outer join, tergantung pada tabel's baris dipertahankan (kiri atau kanan).
Left Outer Join:- Hasil dari left outer join (atau hanya meninggalkan bergabung) untuk tabel Karyawan dan Lokasi selalu berisi semua catatan "kiri" tabel (Karyawan), bahkan jika bergabung-kondisi tidak menemukan catatan yang cocok di "benar" tabel (Lokasi). Berikut adalah apa SQL untuk left outer join akan terlihat seperti, dengan menggunakan tabel di atas:
Sekarang, di sini adalah apa hasil dari menjalankan SQL ini akan terlihat seperti:
Right Outer Join:- A right outer join (atau kanan bergabung dengan) erat menyerupai left outer join, kecuali dengan pengobatan meja terbalik. Setiap baris dari "benar" tabel (Lokasi) akan muncul di bergabung tabel setidaknya sekali. Jika tidak ada baris pencocokan dari "kiri" tabel (Karyawan) ada, NULL akan muncul di kolom dari Karyawan untuk catatan-catatan yang tidak memiliki pertandingan di Lokasi. Ini adalah apa yang SQL terlihat seperti:
Dengan menggunakan tabel di atas, kita dapat menunjukkan apa hasilnya himpunan a right outer join akan terlihat seperti:
Full Outer Join:- Full Outer Join atau Penuh Bergabung adalah untuk mempertahankan nonmatching informasi termasuk nonmatching baris dalam hasil yang bergabung, menggunakan full outer join. Ini mencakup semua baris dari tabel kedua, terlepas dari apakah atau tidak tabel lain memiliki nilai pencocokan.
Sumber Gambar
MySQL 8.0 Referensi Manual - Bergabung Dengan Sintaks
Oracle Bergabung dengan operasi
Inner Join
Mengambil dicocokkan baris saja, yaitu,
Yang berpotongan B
.Left Outer Join
Memilih semua record dari tabel pertama, dan setiap catatan di kedua meja yang sesuai dengan bergabung kunci.
Full Outer Join
Memilih semua record dari kedua tabel, dan catatan dalam pertama meja yang sesuai dengan bergabung kunci.
Referensi
Dalam dan luar bergabung SQL contoh dan Bergabung dengan blok
SQL: BERGABUNG
Dalam kata-kata sederhana:
An inner join mengambil dicocokkan baris saja.
Sedangkan outer join mengambil sesuai baris dari satu tabel dan semua baris di tabel lain ....hasilnya tergantung pada mana yang anda gunakan:
Kiri: Sesuai baris di tabel kanan dan semua baris di tabel kiri
Tepat: Sesuai baris di tabel kiri dan semua baris di tabel kanan atau
Full: Semua baris di tabel. Itu doesn't peduli jika ada pertandingan atau tidak
Gabungan dalam hanya menampilkan baris jika ada catatan yang cocok di sisi lain (kanan) dari gabungan.
Gabungan luar (kiri) menunjukkan baris untuk setiap rekaman di sisi kiri, bahkan jika tidak ada baris yang cocok di sisi lain (kanan) dari gabungan. Jika tidak ada baris yang cocok, kolom-kolom untuk sisi lain (kanan) akan menampilkan NULL.
Inner join mengharuskan record dengan ID terkait ada dalam tabel yang digabungkan.
Outer join akan mengembalikan record untuk sisi kiri bahkan jika tidak ada record yang ada untuk sisi kanan.
Misalnya, Anda memiliki tabel Orders dan tabel OrderDetails. Mereka dihubungkan oleh "OrderID".
Pesanan
RincianPesanan
Permintaan
hanya akan mengembalikan Pesanan yang juga memiliki sesuatu di tabel OrderDetails.
Jika Anda mengubahnya menjadi OUTER LEFT JOIN
maka itu akan mengembalikan catatan dari tabel Pesanan bahkan jika mereka tidak memiliki catatan OrderDetails.
Anda dapat menggunakan ini untuk menemukan Pesanan yang tidak memiliki OrderDetails yang mengindikasikan kemungkinan pesanan yatim piatu dengan menambahkan klausa where seperti
WHERE OrderDetails.OrderID IS NULL
.Dalam kata-kata sederhana :
Inner join -> Mengambil HANYA umum catatan dari orang tua dan anak tabel DIMANA primary key dari tabel Induk pertandingan Foreign key di tabel Anak.
Kiri bergabung ->
pseudo code
Tepat bergabung : kebalikan dari left join . Masukan nama tabel di KIRI BERGABUNG di sisi kanan di Kanan bergabung , anda mendapatkan output yang sama seperti KIRI BERGABUNG.
Outer join : Menampilkan semua record di tabel Kedua
Tidak peduli
. Jika catatan di Kiri meja yang tidak sesuai ke kanan tabel berdasarkan Primary , Forieign kunci , menggunakan nilai NULL sebagai hasil dari bergabung .Contoh :
Mari kita asumsikan sekarang untuk 2 tabel
1.karyawan , 2.phone_numbers_employees
Di sini , karyawan tabel Master tabel , phone_numbers_employees adalah tabel anak(mengandung
emp_id
sebagai foreign key yang menghubungkankaryawan.id
jadi anak meja.)Batin bergabung
Mengambil record dari 2 tabel HANYA JIKA Primary key dari tabel karyawan(id) pertandingan Foreign key dari tabel Anak phone_numbers_employees(emp_id).
Sehingga permintaan akan :
Di sini hanya mengambil baris yang cocok pada primary key = kunci asing seperti yang dijelaskan di atas.Di sini non pencocokan baris pada primary key = kunci asing yang dilewati sebagai hasil dari bergabung.
Kiri bergabung :
Kiri bergabung dengan mempertahankan semua baris dari tabel kiri, terlepas dari apakah ada baris yang sesuai pada tabel kanan.
Outer join :
Diagramatically itu terlihat seperti :
Ini adalah sebuah diagram penjelasan untuk semua jenis bergabung
sumber: http://ssiddique.info/understanding-sql-joins-in-easy-way.html
Anda menggunakan
INNER JOIN
untuk mengembalikan semua baris dari tabel kedua di mana ada pertandingan. yaitu Di tabel yang dihasilkan semua baris dan kolom memiliki nilai-nilai.Di
OUTER JOIN
tabel yang dihasilkan mungkin memiliki kolom kosong. Outer join dapat berupaKIRI
atauKANAN
.LEFT OUTER JOIN
mengembalikan semua baris dari tabel pertama, bahkan jika tidak ada pertandingan pada tabel kedua.RIGHT OUTER JOIN
mengembalikan semua baris dari tabel kedua, bahkan jika tidak ada pertandingan pada tabel pertama.INNER JOIN
membutuhkan setidaknya ada pertandingan dalam membandingkan dua tabel. Misalnya, tabel A dan tabel B yang berarti ٨ B (A persimpangan B).LEFT OUTER JOIN
danLEFT JOIN
yang sama. Ini memberikan semua catatan yang cocok di kedua tabel dan semua kemungkinan dari meja sebelah kiri.Demikian pula,
RIGHT OUTER JOIN
danKANAN BERGABUNG
yang sama. Ini memberikan semua catatan yang cocok di kedua tabel dan semua kemungkinan dari tabel kanan.PENUH BERGABUNG
adalah kombinasi dariLEFT OUTER JOIN
danRIGHT OUTER JOIN
tanpa duplikasi.Jawabannya adalah dalam arti masing-masing, sehingga dalam hasil.
Jawaban saya adalah berdasarkan atas Catatan.
Bila anda memiliki dua tabel seperti ini:
CROSS JOIN / OUTER JOIN : Anda dapat memiliki semua tabel data dengan
CROSS JOIN
atau hanya dengan,
seperti ini:INNER JOIN : Ketika anda ingin menambahkan filter ke atas hasil berdasarkan pada hubungan seperti
table1.id = table2.id
anda dapat menggunakanINNER JOIN
:KIRI [OUTER] JOIN : Bila anda ingin memiliki semua baris dari satu tabel di atas hasil -sama dengan hubungan - anda dapat menggunakan
LEFT JOIN
: (Untuk TEPAT BERGABUNG hanya mengubah tempat dari tabel)FULL OUTER JOIN : Bila anda juga ingin memiliki semua baris dari tabel lainnya dalam hasil anda, anda dapat menggunakan
FULL OUTER JOIN
:Yah, seperti yang anda butuhkan anda memilih masing-masing yang meliputi kebutuhan anda ;).
Inner join.
Join adalah menggabungkan baris dari dua tabel. An inner join upaya untuk mencocokkan dua tabel berdasarkan kriteria yang anda tentukan dalam query, dan hanya akan menampilkan baris yang sesuai. Jika sebuah baris dari tabel pertama dalam bergabung dengan pertandingan dua baris dalam tabel kedua, kemudian dua baris akan dikembalikan dalam hasil. Jika ada baris pada tabel pertama yang tidak sesuai dengan baris kedua, itu tidak dikembalikan; demikian juga, jika ada baris pada tabel kedua yang tidak sesuai dengan baris pertama, itu tidak dikembalikan.
Outer Join.
A kiri bergabung mencoba untuk menemukan pertandingan hingga baris dari tabel pertama untuk baris dalam tabel kedua. Jika tidak dapat menemukan yang cocok, itu akan kembali kolom dari tabel pertama dan meninggalkan kolom dari tabel kedua kosong (null).
Saya don't melihat banyak rincian tentang kinerja dan optimizer dalam jawaban yang lain.
Kadang-kadang itu baik untuk tahu bahwa hanya
INNER JOIN
adalah asosiatif yang berarti optimizer paling banyak memiliki pilihan untuk bermain dengan itu. Hal ini dapat menyusun ulang bergabung rangka untuk membuatnya lebih cepat menjaga hasil yang sama. Optimizer dapat menggunakan sebagian besar bergabung mode.Umumnya itu adalah praktik yang baik untuk mencoba untuk menggunakan
INNER JOIN
bukan berbeda jenis bergabung. (Tentu saja jika hal ini dimungkinkan mengingat hasil yang diharapkan set.)Ada beberapa contoh yang baik dan penjelasan tentang hal ini di sini yang aneh asosiatif perilaku:
INNER JOIN
paling khas bergabung untuk dua atau lebih tabel. Kembali mencocokkan data pada kedua tabel DI primarykey dan forignkey hubungan.OUTER JOIN
adalah sama denganINNER JOIN
, tetapi juga mencakupNULL
data pada ResultSet.LEFT JOIN
=INNER JOIN
+ tak Tertandingi data kiri tabel denganNull
pertandingan di kanan meja.BENAR BERGABUNG dengan
=INNER JOIN
+ tak Tertandingi data kan tabel denganNull
pertandingan di sebelah kiri meja.PENUH BERGABUNG
=INNER JOIN
+ tak Tertandingi data pada kedua kanan dan kiri tabel denganNull
pertandingan.INNER JOIN
danOUTER JOIN
kita dapat menulis diri query join.Misalnya:
Dengan algoritma yang tepat untuk
INNER JOIN
,LEFT/RIGHT OUTER JOIN
adalah sebagai berikut:a
(a, b[i])
ON ...
klausul terhadap masing-masing pasangan:PADA( a, b[i] ) = true/false?
benar
, kembali yang dikombinasikan baris(a, b[i])
.Outer Join
kemudian kembali (virtual) sepasang menggunakanNull
untuk semua kolom dari tabel lain:(a, Null)
untuk LEFT outer join atau(Null, b)
untuk RIGHT outer join. Hal ini untuk memastikan semua baris dari tabel pertama yang ada di hasil akhir.Catatan: kondisi yang ditentukan dalam
ON
klausul bisa apa-apa, itu tidak diperlukan untuk menggunakan Primary key (dan anda don't harus selalu merujuk ke Kolom dari tabel kedua)! Misalnya:... PADA T1.title = T2.judul DAN T1.versi < T2.versi
( => lihat posting ini sebagai contoh penggunaan: Pilih hanya baris-baris dengan nilai max pada kolom)... PADA T1.y ADALAH NOL
... PADA 1 = 0
(hanya sebagai contoh)Catatan: Kiri Bergabung = Left Outer Join, Right Join = Right Outer Join.
Setelah dikritik banyak digemari merah-berbayang diagram Venn, saya pikir itu hanya adil untuk posting saya sendiri mencoba.
Meskipun @Martin Smith's jawaban yang terbaik dari bunch dengan cara lama, hanya menunjukkan kolom kunci dari meja masing-masing, sedangkan saya pikir idealnya non-key kolom juga harus ditunjukkan.
Yang terbaik yang bisa saya lakukan di setengah jam peliharaan diizinkan, aku masih don't pikir itu cukup menunjukkan bahwa nulls yang ada karena tidak adanya nilai-nilai kunci dalam
TableB
atau yangOUTER JOIN
sebenarnya adalah sebuah serikat daripada bergabung:Sederhana Definisi
Inner Join: Kembali cocok catatan dari kedua tabel.
Full Outer Join: Mengembalikan cocok dan tak tertandingi catatan dari kedua tabel dengan null tak tertandingi catatan dari Kedua Tabel.
Left Outer Join: Mengembalikan cocok dan tak tertandingi catatan hanya dari tabel di Kiri.
Right Outer Join: Mengembalikan cocok dan tak tertandingi catatan hanya dari tabel di Kanan.
Di-Pendek
Cocok + Kiri Yang Tak Tertandingi + Kanan Yang Tak Tertandingi = Full Outer Join
Cocok + Kiri Yang Tak Tertandingi = Left Outer Join
Cocok + Kanan Yang Tak Tertandingi = Right Outer Join
Cocok Dengan = Inner Join
Dalam Istilah Sederhana,
1.INNER JOIN ATAU EQUI JOIN : Mengembalikan resultset yang hanya sesuai dengan kondisi di kedua tabel.
2.OUTER JOIN : Mengembalikan resultset dari semua nilai-nilai dari kedua tabel, bahkan jika ada kondisi yang cocok atau tidak.
3.KIRI BERGABUNG : Mengembalikan resultset dari semua nilai-nilai dari kiri meja dan hanya baris yang sesuai dengan kondisi di meja tepat.
4.TEPAT BERGABUNG : Mengembalikan resultset dari semua nilai-nilai dari kanan meja dan hanya baris yang sesuai dengan kondisi di kiri meja.
5.PENUH BERGABUNG : Penuh Bergabung dan Full outer Join yang sama.
1.Inner Join: disebut Juga Bergabung. Ia mengembalikan baris yang hadir di kedua tabel Kiri, dan kanan meja hanya jika ada pertandingan. Jika tidak, itu kembali nol catatan.
Contoh:
2.Full Outer Join: Juga disebut sebagai Penuh Bergabung. Kembali semua baris hadir di kedua tabel Kiri, dan kanan tabel.
Contoh:
3.Left Outer join: Atau cukup disebut sebagai Kiri Bergabung. Ia mengembalikan semua baris yang hadir di meja sebelah Kiri dan baris yang cocok dari tabel kanan (jika ada).
4.Right Outer Join: Juga disebut sebagai Hak Bergabung. Kembali baris yang cocok dari tabel kiri (jika ada), dan semua baris yang ada di sebelah Kanan meja.
Keuntungan Bergabung