Juga bagaimana LEFT JOIN
, RIGHT JOIN
dan FULL JOIN
cocok?
sql
database
join
inner-join
outer-join
Chris de Vries
sumber
sumber
Jawaban:
Dengan asumsi Anda bergabung di kolom tanpa duplikat, yang merupakan kasus yang sangat umum:
Sambungan dalam dari A dan B memberikan hasil dari A berpotongan B, yaitu bagian dalam dari persimpangan diagram Venn .
Gabungan luar dari A dan B memberikan hasil dari serikat A B, yaitu bagian luar dari serikat diagram Venn.
Contohnya
Misalkan Anda memiliki dua tabel, masing-masing dengan satu kolom, dan data sebagai berikut:
Perhatikan bahwa (1,2) adalah unik untuk A, (3,4) adalah umum, dan (5,6) unik untuk B.
Batin bergabung
Gabungan dalam menggunakan salah satu kueri yang setara memberikan persimpangan dua tabel, yaitu dua baris yang sama-sama mereka miliki.
Gabung luar kiri
Gabung luar kiri akan memberikan semua baris dalam A, ditambah baris umum dalam B.
Gabung luar kanan
Gabung luar kanan akan memberikan semua baris dalam B, ditambah baris umum dalam A.
Gabung luar penuh
Gabungan luar penuh akan memberi Anda gabungan A dan B, yaitu semua baris dalam A dan semua baris dalam B. Jika sesuatu dalam A tidak memiliki datum yang sesuai dalam B, maka bagian B adalah nol, dan sebaliknya sebaliknya.
sumber
Diagram Venn tidak benar-benar melakukannya untuk saya.
Mereka tidak menunjukkan perbedaan antara gabungan silang dan gabungan internal, misalnya, atau lebih umum menunjukkan perbedaan antara berbagai jenis predikat gabungan atau menyediakan kerangka kerja untuk alasan tentang bagaimana mereka akan beroperasi.
Tidak ada pengganti untuk memahami pemrosesan logis dan relatif mudah dipahami.
on
klausa terhadap semua baris dari langkah 1 menjaga mereka di mana predikat dievaluasitrue
(NB: Dalam praktiknya pengoptimal kueri dapat menemukan cara yang lebih efisien untuk mengeksekusi kueri daripada uraian yang murni logis di atas tetapi hasil akhirnya harus sama)
Saya akan mulai dengan versi animasi dari gabungan luar penuh . Penjelasan lebih lanjut berikut.
Penjelasan
Tabel Sumber
Pertama mulai dengan
CROSS JOIN
(Produk Cartesian AKA). Ini tidak memilikiON
klausa dan hanya mengembalikan setiap kombinasi baris dari dua tabel.PILIH A. Warna, B. Warna DARI LINTAS BERGABUNG B
Gabungan dalam dan luar memiliki predikat klausa "ON".
Beberapa contoh
PILIH A. Warna, B. Warna DARI DALAM BATIN GABUNG B PADA A. Warna = B. Warna
Di atas adalah equi gabung klasik.
Versi Animasi
PILIH A. Warna, B. Warna DARI DALAM BATIN GABUNG B PADA A. Warna TIDAK DALAM ('Hijau', 'Biru')
Kondisi sambungan dalam tidak harus berupa kondisi persamaan dan tidak perlu referensi kolom dari kedua (atau bahkan salah satu) dari tabel. Mengevaluasi
A.Colour NOT IN ('Green','Blue')
pada setiap baris salib bergabung dengan pengembalian.PILIH A. Warna, B. Warna DARI DALAM BATIN GABUNG B ON 1 = 1
Kondisi gabungan dievaluasi benar untuk semua baris dalam hasil gabungan silang, jadi ini sama dengan gabungan silang. Saya tidak akan mengulangi gambar 16 baris lagi.
PILIH A. Warna, B. Warna DARI LUAR KIRI BERGABUNG B PADA A. Warna = B. Warna
Gabungan Luar dievaluasi secara logis dengan cara yang sama dengan gabungan dalam kecuali bahwa jika satu baris dari tabel kiri (untuk gabungan kiri) tidak bergabung dengan baris apa pun dari tabel sebelah kanan sama sekali dipertahankan dalam hasil dengan
NULL
nilai untuk kolom tangan kanan.PILIH A. Warna, B. Warna DARI LEFT OUTER BERGABUNG B PADA A. Warna = B. Warna MANA SAJA B. Warna ADALAH NULL
Ini hanya membatasi hasil sebelumnya hanya mengembalikan baris di mana
B.Colour IS NULL
. Dalam kasus khusus ini, ini akan menjadi baris yang dipertahankan karena mereka tidak memiliki kecocokan di tabel sebelah kanan dan kueri mengembalikan baris merah tunggal yang tidak cocok dalam tabelB
. Ini dikenal sebagai anti semi join.Penting untuk memilih kolom untuk
IS NULL
pengujian yang tidak dapat dibatalkan atau untuk kondisi gabungan memastikan bahwaNULL
nilai apa pun akan dikecualikan agar pola ini berfungsi dengan benar dan menghindari hanya mengembalikan baris yang kebetulan memilikiNULL
nilai untuk itu kolom di samping baris yang tidak cocok.PILIH A. Warna, B. Warna DARI LUAR YANG TEPAT BERGABUNG B PADA A. Warna = B. Warna
Gabungan luar kanan bertindak serupa dengan gabungan luar kiri kecuali mereka mempertahankan baris yang tidak cocok dari tabel kanan dan null memperpanjang kolom sebelah kiri.
SELECT A.Colour, B.Colour DARI FULL OUTER, GABUNG B ON A.Colour = B.Colour
Gabungan luar penuh menggabungkan perilaku gabungan kiri dan kanan dan mempertahankan baris yang tidak cocok dari tabel kiri dan kanan.
PILIH A.Warna, B.Warna DARI OUTER LENGKAP, GABUNG B ON 1 = 0
Tidak ada baris dalam tanda silang yang cocok dengan
1=0
predikat. Semua baris dari kedua sisi dipertahankan menggunakan aturan join luar normal dengan NULL di kolom dari tabel di sisi lainnya.SELECT COALESCE (A.Colour, B.Colour) SEBAGAI Warna DARI FULL OUTER JOIN B ON 1 = 0
Dengan sedikit perubahan pada kueri sebelumnya, orang dapat mensimulasikan satu
UNION ALL
dari dua tabel.PILIH A. Warna, B. Warna DARI LUAR KIRI, GABUNG B PADA A. Warna = B. Warna MANA SAJA B. Warna = 'Hijau'
Perhatikan bahwa
WHERE
klausa (jika ada) secara logis berjalan setelah bergabung. Salah satu kesalahan umum adalah melakukan gabungan luar kiri dan kemudian memasukkan klausa WHERE dengan kondisi di tabel kanan yang berakhir tidak termasuk baris yang tidak cocok. Di atas akhirnya melakukan gabungan luar ...... Dan kemudian klausa "Di mana" berjalan.
NULL= 'Green'
tidak mengevaluasi ke true sehingga baris yang diawetkan oleh sambungan luar berakhir dibuang (bersama dengan yang biru) secara efektif mengubah sambungan kembali ke yang dalam.Jika maksudnya hanya menyertakan baris dari B di mana Warna adalah Hijau dan semua baris dari A terlepas dari sintaks yang benar akan menjadi
PILIH A.Warna, B.Warna DARI LUAR KIRI, GABUNG B PADA A.Warna = B.Warna dan B.Warna = 'Hijau'
SQL Fiddle
Lihat contoh-contoh ini dijalankan langsung di SQLFiddle.com .
sumber
Bergabung digunakan untuk menggabungkan data dari dua tabel, dengan hasil menjadi tabel sementara yang baru. Bergabung dilakukan berdasarkan sesuatu yang disebut predikat, yang menentukan kondisi yang digunakan untuk melakukan gabungan. Perbedaan antara gabungan dalam dan gabungan luar adalah bahwa gabungan dalam akan mengembalikan hanya baris yang benar-benar cocok berdasarkan predikat bergabung. Untuk eg- Mari kita pertimbangkan tabel Karyawan dan Lokasi:
Gabung Dalam: - Gabung dalam menciptakan tabel hasil baru dengan menggabungkan nilai kolom dua tabel ( Karyawan dan Lokasi ) berdasarkan predikat gabung. Kueri membandingkan setiap baris Karyawan dengan setiap baris Lokasi untuk menemukan semua pasangan baris yang memenuhi predikat gabungan. Ketika predikat gabungan dipenuhi dengan mencocokkan nilai-nilai non-NULL, nilai-nilai kolom untuk setiap pasangan baris yang cocok dari Karyawan dan Lokasi digabungkan menjadi baris hasil. Inilah yang akan terlihat seperti SQL untuk gabungan dalam:
Sekarang, inilah hasil dari menjalankan SQL akan terlihat seperti:
Gabung Luar: - Gabung luar tidak mengharuskan setiap catatan dalam dua tabel yang digabungkan untuk memiliki catatan yang cocok. Tabel yang digabungkan mempertahankan setiap catatan — bahkan jika tidak ada catatan yang cocok lainnya. Gabungan luar membagi lebih jauh menjadi gabungan luar kiri dan gabungan luar kanan, tergantung pada baris tabel mana yang dipertahankan (kiri atau kanan).
Gabung Luar Kiri: - Hasil gabung luar kiri (atau gabung kiri saja) untuk tabel Karyawan dan Lokasi selalu berisi semua catatan tabel "kiri" ( Karyawan ), bahkan jika kondisi gabung tidak menemukan catatan yang cocok di tabel "kanan" ( Lokasi ). Berikut ini tampilannya SQL untuk gabungan luar kiri, menggunakan tabel di atas:
Sekarang, inilah hasil dari menjalankan SQL ini akan terlihat seperti:
Gabung Luar Kanan: - Gabung luar kanan (atau gabung kanan) sangat menyerupai gabung luar kiri, kecuali dengan perlakuan tabel terbalik. Setiap baris dari tabel "kanan" ( Lokasi ) akan muncul di tabel yang digabungkan setidaknya satu kali. Jika tidak ada baris yang cocok dari tabel "kiri" ( Karyawan ), NULL akan muncul di kolom dari Karyawan untuk catatan yang tidak memiliki kecocokan di Lokasi . Seperti inilah tampilan SQL:
Dengan menggunakan tabel di atas, kita dapat menunjukkan seperti apa hasil dari gabungan luar kanan akan terlihat seperti:
Gabungan Luar Penuh: - Full Outer Join atau Full Join adalah untuk mempertahankan informasi yang tidak cocok dengan memasukkan baris yang tidak cocok dalam hasil sambungan, gunakan gabungan luar penuh. Ini mencakup semua baris dari kedua tabel, terlepas dari apakah tabel lain memiliki nilai yang cocok atau tidak.
Sumber Gambar
Manual Referensi MySQL 8.0 - Bergabunglah dengan Sintaks
Oracle Bergabung dengan operasi
sumber
Bergabunglah dengan Batin
Ambil baris yang cocok saja, yaitu
A intersect B
,.Kiri Luar Gabung
Pilih semua catatan dari tabel pertama, dan semua catatan di tabel kedua yang cocok dengan kunci yang digabungkan.
Gabung Luar Penuh
Pilih semua catatan dari tabel kedua, dan semua catatan di tabel pertama yang cocok dengan kunci yang digabungkan.
Referensi
Bagian dalam dan bagian luar bergabung dengan contoh SQL dan blok Gabung
SQL: BERGABUNG
sumber
Dengan kata sederhana:
Sebuah bergabung dalam mengambil baris cocok saja.
Sedangkan gabungan luar mengambil baris yang cocok dari satu tabel dan semua baris di tabel lain .... hasilnya tergantung pada yang Anda gunakan:
Kiri : Baris yang cocok di tabel kanan dan semua baris di tabel kiri
Kanan : Baris yang cocok di tabel kiri dan semua baris di tabel kanan atau
Lengkap : Semua baris di semua tabel. Tidak masalah apakah ada kecocokan atau tidak
sumber
Gabung bagian dalam hanya menampilkan baris jika ada catatan yang cocok di sisi gabung lainnya (kanan).
Gabungan luar (kiri) menunjukkan baris untuk setiap catatan di sisi kiri, bahkan jika tidak ada baris yang cocok di sisi lainnya (kanan) gabungan. Jika tidak ada baris yang cocok, kolom untuk sisi lain (kanan) akan menampilkan NULLs.
sumber
Gabungan dalam mengharuskan catatan dengan ID terkait ada di tabel bergabung.
Gabungan luar akan mengembalikan catatan untuk sisi kiri bahkan jika tidak ada yang ada untuk sisi kanan.
Misalnya, Anda memiliki tabel Pesanan dan Tabel Pesan. Mereka terkait oleh "OrderID".
Pesanan
Detail pesanan
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 OrderDetail yang menunjukkan kemungkinan pesanan yatim dengan menambahkan klausa di mana seperti
WHERE OrderDetails.OrderID IS NULL
.sumber
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
keSELECT 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
(MySQL) dengan sukses. Saya tidak yakin tentang kondisi tambahan, mereka bercampur dengan baik ...Dengan kata sederhana:
Batin bergabung -> HANYA HANYA catatan umum dari tabel induk dan anak DI MANA kunci utama tabel Induk cocok dengan kunci Asing di tabel Anak.
Kiri gabung ->
kode semu
Bergabunglah dengan benar : Bertolak belakang dengan gabung kiri. Letakkan nama tabel di LEFT JOIN di sebelah kanan di Right join, Anda mendapatkan output yang sama dengan LEFT JOIN.
Gabungan luar : Tampilkan semua catatan di kedua tabel
No matter what
. Jika catatan di tabel kiri tidak cocok dengan tabel kanan berdasarkan pada primer, kunci Forieign, gunakan nilai NULL sebagai hasil dari bergabung.Contoh:
Mari kita asumsikan sekarang untuk 2 tabel
1.employees , 2.phone_numbers_employees
Di sini, tabel karyawan adalah tabel Master, phone_numbers_employees adalah tabel anak (ini berisi
emp_id
kunci asing yang menghubungkanemployee.id
tabel anak-nya.)Bergabung batin
Catat 2 tabel HANYA JIKA Kunci utama tabel karyawan (ID-nya) cocok dengan kunci Asing dari tabel Anak phone_numbers_employees (emp_id) .
Jadi kueri akan menjadi:
Di sini, ambil hanya baris yang cocok pada kunci primer = kunci asing seperti yang dijelaskan di atas. Di sini baris yang tidak cocok pada kunci primer = kunci asing dilewati sebagai hasil penggabungan.
Gabungan kiri :
Gabung kiri mempertahankan semua baris tabel kiri, terlepas dari apakah ada baris yang cocok di tabel kanan.
Gabungan luar :
Secara diagram terlihat seperti:
sumber
Kau gunakan
INNER JOIN
untuk mengembalikan semua baris dari kedua tabel di mana ada kecocokan. yaitu Dalam tabel yang dihasilkan semua baris dan kolom akan memiliki nilai.Di
OUTER JOIN
tabel yang dihasilkan mungkin memiliki kolom kosong. Gabung luar bisa berupaLEFT
atauRIGHT
.LEFT OUTER JOIN
mengembalikan semua baris dari tabel pertama, bahkan jika tidak ada kecocokan di tabel kedua.RIGHT OUTER JOIN
mengembalikan semua baris dari tabel kedua, bahkan jika tidak ada kecocokan di tabel pertama.sumber
Ini adalah penjelasan diagram yang baik untuk semua jenis sambungan
sumber: http://ssiddique.info/understanding-sql-joins-in-easy-way.html
sumber
INNER JOIN
mensyaratkan setidaknya ada kecocokan dalam membandingkan dua tabel. Misalnya, tabel A dan tabel B yang menyiratkan A ٨ B (persimpangan B).LEFT OUTER JOIN
danLEFT JOIN
sama. Ini memberikan semua catatan yang cocok di kedua tabel dan semua kemungkinan di tabel kiri.Demikian pula,
RIGHT OUTER JOIN
danRIGHT JOIN
sama. Ini memberikan semua catatan yang cocok di kedua tabel dan semua kemungkinan dari tabel yang tepat.FULL JOIN
adalah kombinasi dariLEFT OUTER JOIN
danRIGHT OUTER JOIN
tanpa duplikasi.sumber
Jawabannya adalah dalam arti masing-masing, demikian juga dalam hasilnya.
Jawaban saya didasarkan pada Catatan di atas .
Ketika Anda memiliki dua tabel seperti ini:
CROSS JOIN / OUTER JOIN:
Anda dapat memiliki semua data tabel dengan
CROSS JOIN
atau hanya dengan,
seperti ini:INNER JOIN:
Ketika Anda ingin menambahkan filter ke hasil di atas berdasarkan pada relasi seperti
table1.id = table2.id
yang dapat Anda gunakanINNER JOIN
:LEFT [OUTER] GABUNG:
Ketika Anda ingin memiliki semua baris dari salah satu tabel di hasil di atas - dengan hubungan yang sama - Anda dapat menggunakan
LEFT JOIN
:(Untuk KANAN BERGABUNG hanya mengubah tempat tabel)
FULL OUTER JOIN:
Ketika Anda juga ingin memiliki semua baris tabel lain dalam hasil Anda, Anda dapat menggunakan
FULL OUTER JOIN
:Nah, sesuai kebutuhan Anda, Anda memilih masing-masing yang memenuhi kebutuhan Anda;).
sumber
full outer join
di MySQL juga.Batin bergabung.
Gabung menggabungkan baris dari dua tabel. Gabungan dalam mencoba untuk mencocokkan dua tabel berdasarkan kriteria yang Anda tentukan dalam kueri, dan hanya mengembalikan baris yang cocok. Jika satu baris dari tabel pertama dalam gabungan cocok dengan dua baris di tabel kedua, maka dua baris akan dikembalikan dalam hasil. Jika ada baris di tabel pertama yang tidak cocok dengan baris di yang kedua, itu tidak dikembalikan; juga, jika ada baris di tabel kedua yang tidak cocok dengan baris di yang pertama, itu tidak dikembalikan.
Outer Join.
Sebuah meninggalkan bergabung upaya untuk menemukan cocok baris dari tabel pertama yang baris dalam tabel kedua. Jika tidak dapat menemukan kecocokan, itu akan mengembalikan kolom dari tabel pertama dan membiarkan kolom dari tabel kedua kosong (nol).
sumber
INNER JOIN
paling umum bergabung untuk dua atau lebih tabel. Ini mengembalikan data yang cocok pada kedua tabel pada relung primer dan relung meja.OUTER JOIN
sama denganINNER JOIN
, tetapi juga termasukNULL
data di ResultSet.LEFT JOIN
=INNER JOIN
+ Data yang tidak cocok dari tabel kiri denganNull
kecocokan di tabel kanan.RIGHT JOIN
=INNER JOIN
+ Data yang tidak cocok dari tabel kanan denganNull
kecocokan di tabel kiri.FULL JOIN
=INNER JOIN
+ Data yang tidak cocok pada tabel kanan dan kiri denganNull
kecocokan.INNER JOIN
danOUTER JOIN
kita dapat menulis permintaan bergabung sendiri.Sebagai contoh:
sumber
Saya tidak melihat banyak detail tentang kinerja dan pengoptimal dalam jawaban lain.
Terkadang hanya baik untuk mengetahui hal itu
INNER JOIN
asosiatif yang berarti pengoptimal memiliki opsi paling banyak untuk bermain dengannya. Itu dapat menyusun ulang urutan bergabung untuk membuatnya lebih cepat menjaga hasil yang sama. Pengoptimal dapat menggunakan mode bergabung paling banyak.Secara umum, ini adalah praktik yang baik untuk mencoba menggunakan
INNER JOIN
alih-alih berbagai jenis sambungan. (Tentu saja jika mungkin mempertimbangkan hasil yang diharapkan ditetapkan.)Ada beberapa contoh dan penjelasan yang baik di sini tentang perilaku asosiatif yang aneh ini:
sumber
INNER JOIN
lebih lambat daripadaLEFT JOIN
di sebagian besar waktu, Dan orang dapat menggunakanLEFT JOIN
alih-alihINNER JOIN
dengan menambahkanWHERE
untuk menghapusNULL
hasil yang tidak terduga ;).INNER
lebih lambat?Setelah mengkritik diagram Venn berbayang merah yang sangat digemari, saya pikir hanya adil untuk memposting upaya saya sendiri.
Meskipun jawaban @Martin Smith adalah yang terbaik dari banyak ini dengan cara yang panjang, hanya menunjukkan kolom kunci dari setiap tabel, sedangkan saya pikir idealnya kolom non-kunci juga harus ditampilkan.
Yang terbaik yang bisa saya lakukan dalam waktu setengah jam diperbolehkan, saya masih tidak berpikir itu cukup menunjukkan bahwa nol ada di sana karena tidak adanya nilai-nilai kunci dalam
TableB
atau yangOUTER JOIN
sebenarnya merupakan persatuan daripada gabungan:sumber
TableA a LEFT OUTER JOIN TableB b
denganTableB B RIGHT OUTER JOIN TableA a
Algoritma yang tepat untuk
INNER JOIN
,LEFT/RIGHT OUTER JOIN
adalah sebagai berikut:a
(a, b[i])
ON ...
klausa terhadap setiap pasangan:ON( a, b[i] ) = true/false?
true
, kembalikan baris gabungan itu(a, b[i])
.Outer Join
lalu kembalikan pasangan (virtual) yang digunakanNull
untuk semua kolom dari tabel lain:(a, Null)
untuk join luar LEFT atau(Null, b)
untuk join luar KANAN. Ini untuk memastikan semua baris tabel pertama ada di hasil akhir.Catatan: kondisi yang ditentukan dalam
ON
klausa bisa apa saja, tidak diharuskan menggunakan Kunci Utama (dan Anda tidak perlu selalu merujuk ke Kolom dari kedua tabel)! Sebagai contoh:... ON T1.title = T2.title AND T1.version < T2.version
(=> lihat posting ini sebagai contoh penggunaan: Pilih hanya baris dengan nilai maksimal pada kolom )... ON T1.y IS NULL
... ON 1 = 0
(seperti sampel)Catatan: Gabung Kiri = Gabung Kiri Luar, Gabung Kanan = Gabung Luar Kanan.
sumber
Definisi Paling Sederhana
Inner Join: Mengembalikan catatan yang cocok dari kedua tabel.
Full Outer Join: Mengembalikan catatan yang cocok dan tidak cocok dari kedua tabel dengan nol untuk catatan yang tidak cocok dari Kedua Tabel .
Kiri Luar Gabung: Mengembalikan catatan yang cocok dan tidak cocok hanya dari tabel di Sisi Kiri .
Right Outer Join: Mengembalikan catatan yang cocok dan tidak cocok hanya dari tabel di Sisi Kanan .
Pendeknya
Cocok + Kiri Tak Tertandingi + Kanan Tidak Tertandingi = Gabung Luar Penuh
Cocok + Kiri Tidak Cocok = Kiri Luar Gabung
Cocok + Right Unmatched = Right Outer Join
Cocok = Bergabung Gabung
sumber
Dalam Ketentuan Sederhana,
1. INNER JOIN ATAU EQUI JOIN: Mengembalikan resultset yang hanya cocok dengan kondisi di kedua tabel.
2. OUTER JOIN: Mengembalikan resultset semua nilai dari kedua tabel meskipun ada kondisi yang cocok atau tidak.
3. LEFT JOIN: Mengembalikan resultset semua nilai dari tabel kiri dan hanya baris yang cocok dengan kondisi di tabel kanan.
4. KANAN BERGABUNG: Mengembalikan resultset semua nilai dari tabel kanan dan hanya baris yang cocok dengan kondisi di tabel kiri.
5. GABUNGAN LENGKAP: Gabung Penuh dan Gabung Luar Penuh sama.
sumber
Ada 2 jenis GABUNGAN utama dalam SQL: [INNER dan OUTER]
Contohnya
Misalkan Anda memiliki dua tabel, masing-masing dengan satu kolom, dan data sebagai berikut:
Perhatikan bahwa (1,2,7,8) adalah unik untuk A, (3,4) adalah umum, dan (5,6) unik untuk B.
Kata kunci INNER JOIN memilih semua baris dari kedua tabel selama kondisinya memuaskan. Kata kunci ini akan membuat hasil-set dengan menggabungkan semua baris dari kedua tabel di mana kondisi terpenuhi yaitu nilai bidang umum akan sama.
Hasil:
Gabung ini mengembalikan semua baris tabel di sisi kiri gabung dan baris yang cocok untuk tabel di sisi kanan gabung. Baris yang tidak ada baris yang cocok di sisi kanan, hasil-set akan berisi nol. LEFT JOIN juga dikenal sebagai
LEFT OUTER JOIN
.Hasil:
Hasil:
FULL (OUTER) GABUNG :
GABUNG LENGKAP menciptakan hasil-set dengan menggabungkan hasil kedua GABUNG KIRI dan GABUNGAN KANAN. Rangkaian hasil akan berisi semua baris dari kedua tabel. Baris di mana tidak ada yang cocok, set hasil akan berisi nilai NULL.
Hasil:
sumber
Gabungan dalam - Gabungan dalam menggunakan salah satu dari kueri yang setara memberi persimpangan dua tabel , yaitu dua baris yang sama-sama mereka miliki.
Gabung luar kiri - Gabung luar kiri akan memberikan semua baris dalam A, ditambah setiap baris umum dalam B.
Gabung terluar penuh - Gabung terluar penuh akan memberi Anda gabungan A dan B, yaitu Semua baris dalam A dan semua baris dalam B. Jika sesuatu dalam A tidak memiliki datum yang sesuai dalam B, maka bagian B adalah null, dan sebaliknya
sumber
Join is not an intersection unless the tables have the same columns
Anda. Anda dapat bergabung dengan kolom apa pun yang Anda inginkan dan jika nilainya cocok, mereka akan bergabung bersama.1. Inner Join: Disebut juga Join. Ini mengembalikan baris yang ada di kedua tabel kiri, dan tabel kanan hanya jika ada kecocokan . Kalau tidak, ia mengembalikan nol catatan.
Contoh:
2. Full Outer Join: Disebut juga Full Join. Ini mengembalikan semua baris yang ada di kedua tabel kiri, dan tabel kanan.
Contoh:
3. Left Outer join: Atau cukup disebut Left Join. Ini mengembalikan semua baris yang ada di tabel kiri dan mencocokkan baris dari tabel kanan (jika ada).
4. Right Outer Join: Disebut juga Right Join. Ini mengembalikan baris yang cocok dari tabel kiri (jika ada), dan semua baris hadir di tabel Kanan.
Keuntungan Bergabung
sumber
Pertimbangkan di bawah 2 tabel:
EMP
Departemen
Bergabunglah dengan Batin:
Sebagian besar ditulis hanya sebagai GABUNG dalam kueri sql. Hanya mengembalikan catatan yang cocok di antara tabel.
Cari tahu semua karyawan dan nama departemen mereka:
Seperti yang Anda lihat di atas,
Jose
tidak dicetak dari EMP di output karena dept_id6
tidak menemukan kecocokan di tabel Departemen. Demikian pula,HR
danR&D
baris tidak dicetak dari Departemen tabel karena mereka tidak menemukan kecocokan di tabel Emp.Jadi, INNER BERGABUNG atau hanya BERGABUNG, hanya mengembalikan baris yang cocok.
KIRI BERGABUNG:
Ini mengembalikan semua catatan dari tabel LEFT dan hanya catatan yang cocok dari tabel KANAN.
Jadi, jika Anda mengamati output di atas, semua catatan dari tabel LEFT (Emp) dicetak hanya dengan catatan yang cocok dari tabel KANAN.
HR
danR&D
baris tidak dicetak dari tabel Department karena mereka tidak menemukan kecocokan di tabel Emp pada dept_id.Jadi, LEFT JOIN mengembalikan SEMUA baris dari tabel Kiri dan hanya baris yang cocok dari tabel KANAN.
Juga dapat memeriksa DEMO di sini .
sumber
Ide Umum
Silakan lihat jawaban oleh Martin Smith untuk ilustrasi dan penjelasan yang lebih baik dari gabungan yang berbeda, termasuk dan terutama perbedaan antara
FULL OUTER JOIN
,RIGHT OUTER JOIN
danLEFT OUTER JOIN
.Kedua tabel ini membentuk dasar untuk representasi huruf-huruf
JOIN
di bawah ini:LINTAS BERGABUNG
Hasilnya akan menjadi produk Cartesian dari semua kombinasi. Tidak
JOIN
diperlukan kondisi:INNER BERGABUNG
INNER JOIN
sama dengan:JOIN
Hasilnya akan berupa kombinasi yang memenuhi persyaratan yang disyaratkan
JOIN
:LEFT OUTER BERGABUNG
LEFT OUTER JOIN
sama denganLEFT JOIN
Hasilnya akan menjadi segalanya dari
citizen
bahkan jika tidak ada kecocokan dipostalcode
. Sekali lagiJOIN
diperlukan suatu kondisi:Data untuk diputar
Semua contoh telah dijalankan pada Oracle 18c. Mereka tersedia di dbfiddle.uk yang juga merupakan tempat screenshot dari tabel.
Batas yang kabur saat bermain dengan
JOIN
danWHERE
LINTAS BERGABUNG
CROSS JOIN
menghasilkan baris sebagai The General Idea /INNER JOIN
:Menggunakan
CROSS JOIN
untuk mendapatkan hasilLEFT OUTER JOIN
memerlukan trik seperti menambahkanNULL
berturut - turut. Itu dihilangkan.INNER BERGABUNG
INNER JOIN
menjadi produk kartesius. Ini sama dengan The General Idea /CROSS JOIN
:Di sinilah join dalam benar-benar dapat dilihat sebagai cross join dengan hasil yang tidak cocok dengan kondisi yang dihapus. Di sini tidak ada baris yang dihasilkan dihapus.
Menggunakan
INNER JOIN
untuk mendapatkan hasilLEFT OUTER JOIN
juga membutuhkan trik. Itu dihilangkan.LEFT OUTER BERGABUNG
LEFT JOIN
menghasilkan baris sebagai The General Idea /CROSS JOIN
:LEFT JOIN
menghasilkan baris sebagai The General Idea /INNER JOIN
:Masalah dengan diagram Venn
Pencarian internet gambar pada "sql join cross inner outer" akan menampilkan banyak diagram Venn. Saya dulu punya salinan cetak satu di meja saya. Tetapi ada masalah dengan representasi.
Diagram Venn sangat baik untuk teori himpunan, di mana suatu elemen dapat berada dalam satu atau kedua set. Tetapi untuk database, elemen dalam satu "set" tampaknya, bagi saya, adalah baris dalam sebuah tabel, dan karena itu tidak juga hadir di tabel lain. Tidak ada yang namanya satu baris hadir dalam beberapa tabel. Baris unik untuk tabel.
Self joins adalah kasus sudut di mana setiap elemen sebenarnya sama di kedua set. Tapi itu masih tidak bebas dari masalah di bawah ini.
Set
A
mewakili set di sebelah kiri (citizen
tabel) dan setB
adalah set di sebelah kanan (postalcode
tabel) dalam diskusi di bawah ini.LINTAS BERGABUNG
Setiap elemen di kedua set dicocokkan dengan setiap elemen di set lain, artinya kita membutuhkan
A
jumlah setiapB
elemen danB
jumlah setiapA
elemen untuk mewakili produk Cartesian ini dengan tepat. Teori himpunan tidak dibuat untuk beberapa elemen identik dalam suatu himpunan, jadi saya menemukan diagram Venn untuk benar mewakili itu tidak praktis / mustahil. Sepertinya tidakUNION
cocok sama sekali.Baris berbeda. The
UNION
adalah 7 baris total. Tapi mereka tidak kompatibel untukSQL
set hasil yang umum . Dan ini bukan caraCROSS JOIN
kerjanya sama sekali:Mencoba menampilkannya seperti ini:
..tapi sekarang itu hanya terlihat seperti
INTERSECTION
, yang tentu saja tidak . Selain itu tidak ada elemen dalamINTERSECTION
yang sebenarnya ada di salah satu dari dua set yang berbeda. Namun, sangat mirip dengan hasil yang dapat dicari yang mirip dengan ini:Untuk referensi, satu hasil yang dapat dicari untuk
CROSS JOIN
s dapat dilihat di Tutorialgateway . TheINTERSECTION
, seperti yang satu ini, kosong.INNER BERGABUNG
Nilai suatu elemen tergantung pada
JOIN
kondisinya. Dimungkinkan untuk mewakili ini dengan syarat bahwa setiap baris menjadi unik untuk kondisi itu. Maknaid=x
hanya berlaku untuk satu baris. Setelah baris dalam tabelA
(citizen
) cocok dengan beberapa baris dalam tabelB
(postalcode
) di bawahJOIN
kondisi, hasilnya memiliki masalah yang sama denganCROSS JOIN
: Baris perlu diwakili beberapa kali, dan teori himpunan tidak benar-benar dibuat untuk itu. Di bawah kondisi keunikan, diagram dapat bekerja, tetapi perlu diingat bahwaJOIN
kondisi menentukan penempatan elemen dalam diagram. Melihat hanya pada nilai-nilaiJOIN
kondisi dengan sisa baris hanya untuk perjalanan:Representasi ini benar-benar terpisah ketika menggunakan
INNER JOIN
denganON 1 = 1
kondisi yang membuatnya menjadiCROSS JOIN
.Dengan self
JOIN
, baris sebenarnya adalah elemen yang identik di kedua tabel, tetapi mewakili tabel sebagai keduanyaA
danB
tidak terlalu cocok. Sebagai contohJOIN
kondisi diri umum yang membuat suatu elemenA
menjadi cocok dengan elemen yang berbeda di B adalahON A.parent = B.child
, membuat kecocokan dariA
keB
pada elemen yang terpisah. Dari contoh-contoh yang akan menjadiSQL
seperti ini:Meaning Smith adalah pemimpin Green dan Jensen.
OUTER BERGABUNG
Sekali lagi masalah dimulai ketika satu baris memiliki beberapa kecocokan untuk baris di tabel lainnya. Ini lebih rumit karena
OUTER JOIN
dapat cocok dengan set kosong. Namun dalam teori himpunan penyatuan himpunan mana punC
dan himpunan kosong, selalu adilC
. Set kosong tidak menambahkan apa pun. Representasi iniLEFT OUTER JOIN
biasanya hanya menunjukkan semuaA
untuk mengilustrasikan bahwa barisA
yang dipilih terlepas dari apakah ada kecocokan atau tidak dariB
. Namun "elemen yang cocok" memiliki masalah yang sama dengan ilustrasi di atas. Mereka bergantung pada kondisinya. Dan set kosong tampaknya telah berkeliaran keA
:WHERE clause - masuk akal
Menemukan semua baris dari a
CROSS JOIN
dengan Smith dan kode pos di Bulan:Sekarang diagram Venn tidak digunakan untuk mencerminkan
JOIN
. Ini hanya digunakan untukWHERE
klausa:..dan itu masuk akal.
Ketika INTERSECT dan UNION masuk akal
MEMOTONG
Seperti yang dijelaskan,
INNER JOIN
sebenarnya bukanINTERSECT
. NamunINTERSECT
s dapat digunakan pada hasil permintaan yang terpisah. Di sini diagram Venn masuk akal, karena unsur-unsur dari kueri yang terpisah sebenarnya adalah baris yang dimiliki hanya oleh salah satu hasil atau keduanya. Persimpangan jelas hanya akan mengembalikan hasil di mana baris hadir di kedua kueri. IniSQL
akan menghasilkan baris yang sama dengan yang di atasWHERE
, dan diagram Venn juga akan sama:PERSATUAN
An
OUTER JOIN
bukan aUNION
. NamunUNION
bekerja dalam kondisi yang sama sepertiINTERSECT
, menghasilkan pengembalian semua hasil menggabungkan keduaSELECT
s:yang setara dengan:
..dan memberikan hasilnya:
Juga di sini diagram Venn masuk akal:
Ketika itu tidak berlaku
Sebuah catatan penting adalah bahwa ini hanya bekerja ketika struktur hasil dari dua SELECT yang sama, memungkinkan perbandingan atau serikat. Hasil dari kedua ini tidak akan memungkinkan itu:
..mencoba menggabungkan hasil dengan
UNION
memberi aUntuk minat lebih lanjut bacalah Say NO to Venn Diagram When Explaining JOINs dan sql gabung sebagai venn diagram . Keduanya juga menutupi
EXCEPT
.sumber
Ada banyak jawaban bagus di sini dengan contoh aljabar relasional yang sangat akurat . Berikut ini adalah jawaban yang sangat sederhana yang mungkin berguna untuk para pembuat kode amatir atau pemula dengan dilema pengodean SQL.
Pada dasarnya, lebih sering daripada tidak, pertanyaan
JOIN
bermuara pada dua kasus:Untuk
SELECT
subset dataA
:INNER JOIN
ketika data terkait yangB
Anda cari HARUS ada per desain basis data;LEFT JOIN
ketika data terkait yangB
Anda cari MUNGKIN atau MUNGKIN TIDAK ada per desain basis data.sumber
Perbedaan antara
inner join
danouter join
adalah sebagai berikut:Inner join
adalah gabungan yang menggabungkan tabel berdasarkan tupel yang cocok, sedangkanouter join
gabungan adalah tabel gabungan berdasarkan pada tupel yang cocok dan tidak cocok.Inner join
menggabungkan baris yang cocok dari dua tabel di mana baris yang tidak cocok dihilangkan, sedangkanouter join
gabungan baris dari dua tabel dan baris yang tidak cocok mengisi dengan nilai nol.Inner join
seperti operasi persimpangan, sedangkanouter join
seperti operasi serikat.Inner join
adalah dua jenis, sedangkanouter join
tiga jenis.outer join
lebih cepat dariinner join
.sumber