Apa perbedaan antara "INNER JOIN" dan "OUTER JOIN"?


4672

Juga bagaimana LEFT JOIN, RIGHT JOINdan FULL JOINcocok?


64
Dari jawaban & komentar & referensi mereka di bawah ini hanya satu yang benar-benar menjelaskan bagaimana diagram Venn mewakili operator: Area persimpangan lingkaran mewakili set baris dalam A JOIN B. Area unik untuk setiap lingkaran mewakili set baris yang Anda dapatkan dengan mengambil baris tabel yang tidak berpartisipasi dalam A GABUNG B dan menambahkan kolom unik ke tabel lainnya semua diatur ke NULL. (Dan sebagian besar memberikan korespondensi palsu palsu dari lingkaran ke A dan B.)
philipxy

1
Melompat dari jawaban berdasarkan teori di bawah ini, ke aplikasi dunia nyata: Saya sering bekerja dengan data eksperimen, menjalankan tolok ukur pada desain prosesor. Seringkali saya ingin membandingkan hasil antara 2 atau lebih opsi perangkat keras. INNER BERGABUNG berarti saya hanya melihat tolok ukur yang berjalan dengan sukses di semua percobaan; OUTER JOIN berarti saya dapat melihat semua percobaan, termasuk yang gagal dijalankan pada beberapa konfigurasi. Penting untuk melihat kegagalan dalam eksperimen tersebut, serta keberhasilan. Cukup penting bahwa saya menulis PerlSQL untuk bergabung dengan OUTER, ketika banyak RDBMS tidak memilikinya,
Krazy Glew

4
Banyak jawaban sudah disediakan tetapi saya belum melihat tutorial ini disebutkan. Jika Anda tahu diagram Venn, ini adalah tutorial HEBAT: blog.codinghorror.com/a-visual-explanation-of-sql-joins Bagi saya, itu cukup ringkas untuk dibaca dengan cepat tetapi masih memahami seluruh konsep dan bekerja dengan semua kasus dengan sangat baik. Jika Anda tidak tahu apa itu diagram Venn - pelajari mereka. Butuh 5-10 menit untuk melakukannya dan akan membantu setiap kali Anda perlu memvisualisasikan bekerja dengan set dan mengelola operasi pada set.
DanteTheSmith

15
@DanteTheSmith Tidak, itu mengalami masalah yang sama dengan diagram di sini. Lihat komentar saya di atas pertanyaan & di bawah posting blog itu: "Jeff menolak blognya beberapa halaman di komentar". Diagram Venn menunjukkan elemen dalam set. Cobalah untuk mengidentifikasi dengan tepat apa set dan apa elemen-elemen dalam diagram ini. Set bukan tabel dan elemen bukan barisnya. Juga ada dua tabel yang dapat digabungkan, sehingga PK & FK tidak relevan. Semua palsu. Anda melakukan apa ribuan orang lain telah dilakukan - mendapat kesan samar Anda (salah) menganggap merek akal.
philipxy

3
Chris Saya sarankan Anda membaca artikel ini: menujudatascience.com/ ... ... dan pertimbangkan untuk mengubah pilihan jawaban yang Anda terima (mungkin ke jawaban dengan karunia) menjadi jawaban yang tidak menggunakan diagram Venn. Jawaban yang diterima saat ini menyesatkan terlalu banyak orang. Saya mendorong Anda untuk melakukan ini demi kebaikan komunitas kami dan kualitas basis pengetahuan kami.
Colm Bhandal

Jawaban:


6115

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:

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

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.

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

Gabung luar kiri

Gabung luar kiri akan memberikan semua baris dalam A, ditambah baris umum dalam B.

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

Gabung luar kanan

Gabung luar kanan akan memberikan semua baris dalam B, ditambah baris umum dalam A.

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

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.

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

42
Akan lebih baik untuk menambah contoh dengan menambahkan baris lain pada tabel B dengan nilai 4. Ini akan menunjukkan bahwa gabungan bagian dalam tidak harus sama dengan tidak ada baris.
softveda

473
Penjelasan yang sangat baik, namun pernyataan ini: Gabungan luar A dan B memberikan hasil A union B, yaitu bagian luar dari union diagram venn. tidak diungkapkan secara akurat. Gabung luar akan memberikan hasil A berpotongan B di samping salah satu dari yang berikut: semua A (gabung kiri), semua B (gabung kanan) atau semua A dan semua B (gabung penuh). Hanya skenario terakhir ini yang benar-benar A union B. Still, penjelasan yang ditulis dengan baik.
Thomas

11
Apakah saya benar bahwa FULL JOIN adalah alias dari FULL OUTER JOIN dan LEFT JOIN adalah alias dari JOIN LEFT OUTER?
Damian

3
ya penjelasan yang bagus dan luar biasa. tetapi mengapa pada kolom b nilainya tidak berurutan? yaitu 6,5 bukan 5,6?
Ameer

7
@Ameer, Terima kasih. Bergabung tidak menjamin pesanan, Anda perlu menambahkan klausa ORDER BY.
Mark Harrison

734

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.

  1. Bayangkan sebuah salib bergabung.
  2. Mengevaluasi onklausa terhadap semua baris dari langkah 1 menjaga mereka di mana predikat dievaluasitrue
  3. (Hanya untuk sambungan luar) tambahkan kembali di baris luar yang hilang di langkah 2.

(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.

masukkan deskripsi gambar di sini


Penjelasan

Tabel Sumber

masukkan deskripsi tautan di sini

Pertama mulai dengan CROSS JOIN(Produk Cartesian AKA). Ini tidak memiliki ONklausa dan hanya mengembalikan setiap kombinasi baris dari dua tabel.

PILIH A. Warna, B. Warna DARI LINTAS BERGABUNG B

masukkan deskripsi tautan di sini

Gabungan dalam dan luar memiliki predikat klausa "ON".

  • Bergabunglah dengan Batin. Evaluasi kondisi dalam klausa "ON" untuk semua baris dalam hasil gabungan silang. Jika benar mengembalikan baris bergabung. Kalau tidak, buang saja.
  • Kiri Luar Gabung. Sama seperti penggabungan dalam maka untuk setiap baris di tabel kiri yang tidak cocok dengan apa pun menghasilkan ini dengan nilai NULL untuk kolom tabel kanan.
  • Gabung Luar Kanan. Sama seperti gabungan dalam kemudian untuk setiap baris di tabel kanan yang tidak cocok dengan apa pun menghasilkan ini dengan nilai NULL untuk kolom tabel kiri.
  • Gabung Luar Penuh. Sama seperti gabung dalam kemudian pertahankan baris tidak cocok kiri seperti di gabung luar kiri dan kanan tidak cocok baris sesuai gabung kanan luar.

Beberapa contoh

PILIH A. Warna, B. Warna DARI DALAM BATIN GABUNG B PADA A. Warna = B. Warna

Di atas adalah equi gabung klasik.

Bergabunglah dengan Batin

Versi Animasi

masukkan deskripsi gambar di sini

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.

batin 2

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 NULLnilai untuk kolom tangan kanan.

LOJ

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 tabel B. Ini dikenal sebagai anti semi join.

Penting untuk memilih kolom untuk IS NULLpengujian yang tidak dapat dibatalkan atau untuk kondisi gabungan memastikan bahwa NULLnilai apa pun akan dikecualikan agar pola ini berfungsi dengan benar dan menghindari hanya mengembalikan baris yang kebetulan memiliki NULLnilai untuk itu kolom di samping baris yang tidak cocok.

loj adalah nol

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.

ROJ

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.

FOJ

PILIH A.Warna, B.Warna DARI OUTER LENGKAP, GABUNG B ON 1 = 0

Tidak ada baris dalam tanda silang yang cocok dengan 1=0predikat. Semua baris dari kedua sisi dipertahankan menggunakan aturan join luar normal dengan NULL di kolom dari tabel di sisi lainnya.

FOJ 2

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 ALLdari dua tabel.

UNION ALL

PILIH A. Warna, B. Warna DARI LUAR KIRI, GABUNG B PADA A. Warna = B. Warna MANA SAJA B. Warna = 'Hijau'

Perhatikan bahwa WHEREklausa (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 ...

LOJ

... 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.

LOJtoInner

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'

masukkan deskripsi gambar di sini

SQL Fiddle

Lihat contoh-contoh ini dijalankan langsung di SQLFiddle.com .


46
Saya akan mengatakan bahwa sementara ini tidak bekerja untuk saya hampir sebaik diagram Venn, saya menghargai bahwa orang bervariasi dan belajar secara berbeda dan ini adalah penjelasan yang disajikan dengan sangat baik tidak seperti yang pernah saya lihat sebelumnya, jadi saya mendukung @ypercube di pemberian poin bonus. Juga pekerjaan yang baik menjelaskan perbedaan menempatkan kondisi tambahan dalam klausa GABUNG vs klausa WHERE. Salam untuk Anda, Martin Smith.
Old Pro

22
@ OldPro Diagram Venn adalah OK sejauh yang saya kira, tetapi mereka diam tentang bagaimana untuk merepresentasikan gabungan silang, atau untuk membedakan satu jenis predikat gabungan seperti equi join dari yang lain. Model mental untuk mengevaluasi predikat join pada setiap baris hasil join join kemudian menambahkan kembali dalam baris yang tak tertandingi jika join luar dan akhirnya mengevaluasi tempat yang lebih baik untuk saya.
Martin Smith

18
Diagram Venn baik untuk mewakili Serikat dan Persimpangan dan Perbedaan tetapi tidak bergabung. Mereka memiliki beberapa nilai pendidikan kecil untuk bergabung sangat sederhana, yaitu bergabung di mana kondisi bergabung berada di kolom unik.
ypercubeᵀᴹ

12
@Arth - Tidak salah. SQL Fiddle sqlfiddle.com/#!3/9eecb7db59d16c80417c72d1/5155 ini adalah sesuatu yang tidak bisa digambarkan oleh diagram Venn.
Martin Smith

7
@ MartinSmith Wow, saya setuju, saya benar-benar salah! Terlalu terbiasa bekerja dengan satu-ke-banyak .. terima kasih atas koreksinya.
Arth

188

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:

masukkan deskripsi gambar di sini

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:

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

Sekarang, inilah hasil dari menjalankan SQL akan terlihat seperti: masukkan deskripsi gambar di sini

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:

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

Sekarang, inilah hasil dari menjalankan SQL ini akan terlihat seperti: masukkan deskripsi gambar di sini

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:

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

Dengan menggunakan tabel di atas, kita dapat menunjukkan seperti apa hasil dari gabungan luar kanan akan terlihat seperti:

masukkan deskripsi gambar di sini

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


3
jawaban terbaik sejauh ini, sintaks alternatif - itulah yang saya cari, terima kasih!
Joey

1
Diagram Venn salah label. Lihat komentar saya pada pertanyaan & jawaban lain. Sebagian besar bahasa ini juga buruk. Misalnya: "Ketika predikat gabungan dipenuhi dengan mencocokkan nilai non-NULL, nilai kolom untuk setiap pasangan baris yang cocok dari Karyawan dan Lokasi digabungkan menjadi baris hasil." Tidak, tidak "Ketika predikat gabungan dipenuhi dengan mencocokkan nilai-nilai non-NULL". Nilai dalam baris tidak penting selain apakah kondisi secara keseluruhan benar atau salah. Beberapa nilai mungkin NULL untuk kondisi sebenarnya.
philipxy

Meskipun tidak secara eksplisit dinyatakan, diagram dalam hal ini adalah diagram Venn. Diagram Venn secara umum bukan merupakan karakterisasi matematis yang tepat untuk suatu gabungan. Saya sarankan menghapus diagram Venn.
Colm Bhandal

@ColmBhandal: dihapus diagram Venn
ajitksharma

Harap gunakan teks, bukan gambar / tautan, untuk teks - termasuk tabel & ERD . Gunakan gambar hanya untuk apa yang tidak bisa dinyatakan sebagai teks atau untuk menambah teks. Gambar tidak dapat dicari atau dipotong & disisipkan. Sertakan legenda / kunci & penjelasan dengan gambar.
philipxy

133

Bergabunglah dengan Batin

Ambil baris yang cocok saja, yaitu A intersect B,.

Masukkan deskripsi gambar di sini

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

Kiri Luar Gabung

Pilih semua catatan dari tabel pertama, dan semua catatan di tabel kedua yang cocok dengan kunci yang digabungkan.

Masukkan deskripsi gambar di sini

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

Gabung Luar Penuh

Pilih semua catatan dari tabel kedua, dan semua catatan di tabel pertama yang cocok dengan kunci yang digabungkan.

Masukkan deskripsi gambar di sini

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

Referensi


14
Apa nama alat itu? Saya menemukan itu menarik karena menunjukkan jumlah baris dan diagram-venn
Grijesh Chauhan

2
@GrijeshChauhan Ya Tapi Anda bisa mencoba menjalankannya menggunakan anggur .
Tushar Gupta - curioustushar

2
Ohh! ya saya .. saya menggunakan SQLyog menggunakan anggur .. ada juga PlayOnLinux
Grijesh Chauhan

1
Teks Anda tidak jelas & salah. "Baris yang cocok hanya" adalah baris dari gabungan silang A & B & apa yang diambil (gabungan dalam B) bukan A berpotongan B tetapi (gabungan kiri B) berpotongan (gabungan kanan B). Baris "terpilih" bukan dari A & B, mereka dari gabungan silang B & dari nilai null-extended dari baris dari A & B.
philipxy

@ TusharGupta-curioustushar Anda harus menyertakan "Tabel yang digunakan untuk Contoh SQL"
Manuel Jordan

112

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


1
@nomen Bukan berarti jawaban ini mengatasinya, tetapi INNER JOIN adalah persimpangan dan FULL OUTER JOIN adalah UNION yang sesuai jika set / lingkaran kiri & kanan berisi baris (berturut-turut) KIRI & KANAN bergabung. PS Jawaban ini tidak jelas tentang baris input vs output. Ini membingungkan "di tabel kiri / kanan" dengan "memiliki bagian kiri / kanan di kiri / kanan" dan menggunakan "baris yang cocok" vs "semua" yang berarti baris yang diperpanjang baris demi baris dari tabel lain vs nol.
philipxy

104

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.


82

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

  • Id pemesanan
  • Nama Pelanggan

Detail pesanan

  • OrderDetailID
  • Id pemesanan
  • Nama Produk
  • Jumlah
  • Harga

Permintaan

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

hanya akan mengembalikan Pesanan yang juga memiliki sesuatu di tabel OrderDetails.

Jika Anda mengubahnya menjadi OUTER LEFT JOIN

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

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.


1
Saya menghargai contoh sederhana namun realistis. Saya mengubah permintaan seperti 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 ASCke 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(MySQL) dengan sukses. Saya tidak yakin tentang kondisi tambahan, mereka bercampur dengan baik ...
PhiLho

68

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

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.
    }
  }

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 tabelNo 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:

Contoh

Mari kita asumsikan sekarang untuk 2 tabel

1.employees , 2.phone_numbers_employees

employees : id , name 

phone_numbers_employees : id , phone_num , emp_id   

Di sini, tabel karyawan adalah tabel Master, phone_numbers_employees adalah tabel anak (ini berisi emp_idkunci asing yang menghubungkan employee.idtabel 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:

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;

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.

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;

Gabungan luar :

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;

Secara diagram terlihat seperti:

Diagram


4
Hasilnya tidak ada hubungannya (lakukan sendiri) dengan kunci primer / unik / kandidat & kunci asing. The baviour dapat dan harus dijelaskan tanpa referensi kepada mereka. Gabung silang dihitung, lalu baris yang tidak cocok dengan kondisi AKTIF disaring; selain itu untuk sambungan luar, baris yang difilter / tidak tertandingi diperpanjang oleh NULLs (per LEFT / RIGHT / FULL dan disertakan.
philipxy

Asumsi bahwa SQL join selalu cocok dengan kunci primer / asing mengarah ke penyalahgunaan diagram Venn ini. Harap perbaiki jawaban Anda sesuai dengan itu.
Colm Bhandal

58

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 JOINtabel yang dihasilkan mungkin memiliki kolom kosong. Gabung luar bisa berupa LEFTatau RIGHT.

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.



54

INNER JOINmensyaratkan setidaknya ada kecocokan dalam membandingkan dua tabel. Misalnya, tabel A dan tabel B yang menyiratkan A ٨ B (persimpangan B).

LEFT OUTER JOIN dan LEFT JOIN sama. Ini memberikan semua catatan yang cocok di kedua tabel dan semua kemungkinan di tabel kiri.

Demikian pula, RIGHT OUTER JOINdan RIGHT JOINsama. Ini memberikan semua catatan yang cocok di kedua tabel dan semua kemungkinan dari tabel yang tepat.

FULL JOINadalah kombinasi dari LEFT OUTER JOINdan RIGHT OUTER JOINtanpa duplikasi.


43

Jawabannya adalah dalam arti masing-masing, demikian juga dalam hasilnya.

Catatan:
Di SQLitetidak ada RIGHT OUTER JOINatau FULL OUTER JOIN.
Dan juga di MySQLsana tidak ada FULL OUTER JOIN.

Jawaban saya didasarkan pada Catatan di atas .

Ketika Anda memiliki dua tabel seperti ini:

--[table1]               --[table2]
id | name                id | name
---+-------              ---+-------
1  | a1                  1  | a2
2  | b1                  3  | b2

CROSS JOIN / OUTER JOIN:
Anda dapat memiliki semua data tabel dengan CROSS JOINatau hanya dengan ,seperti ini:

SELECT * FROM table1, table2
--[OR]
SELECT * FROM table1 CROSS JOIN table2

--[Results:]
id | name | id | name 
---+------+----+------
1  | a1   | 1  | a2
1  | a1   | 3  | b2
2  | b1   | 1  | a2
2  | b1   | 3  | b2

INNER JOIN:
Ketika Anda ingin menambahkan filter ke hasil di atas berdasarkan pada relasi seperti table1.id = table2.idyang dapat Anda gunakan INNER JOIN:

SELECT * FROM table1, table2 WHERE table1.id = table2.id
--[OR]
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id

--[Results:]
id | name | id | name 
---+------+----+------
1  | a1   | 1  | a2

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)

SELECT * FROM table1, table2 WHERE table1.id = table2.id 
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
--[OR]
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id

--[Results:]
id | name | id   | name 
---+------+------+------
1  | a1   | 1    | a2
2  | b1   | Null | Null

FULL OUTER JOIN:
Ketika Anda juga ingin memiliki semua baris tabel lain dalam hasil Anda, Anda dapat menggunakan FULL OUTER JOIN:

SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
UNION ALL
SELECT Null, Null, * FROM table2 WHERE Not table2.id In (SELECT id FROM table1)
--[OR] (recommended for SQLite)
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION ALL
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id
WHERE table1.id IS NULL
--[OR]
SELECT * FROM table1 FULL OUTER JOIN table2 On table1.id = table2.id

--[Results:]
id   | name | id   | name 
-----+------+------+------
1    | a1   | 1    | a2
2    | b1   | Null | Null
Null | Null | 3    | b2

Nah, sesuai kebutuhan Anda, Anda memilih masing-masing yang memenuhi kebutuhan Anda;).


Anda dapat menambahkan ke catatan Anda, bahwa tidak ada full outer joindi MySQL juga.
potashin

35

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).


28

masukkan deskripsi gambar di sini

  • INNER JOINpaling umum bergabung untuk dua atau lebih tabel. Ini mengembalikan data yang cocok pada kedua tabel pada relung primer dan relung meja.
  • OUTER JOINsama dengan INNER JOIN, tetapi juga termasuk NULLdata di ResultSet.
    • LEFT JOIN= INNER JOIN+ Data yang tidak cocok dari tabel kiri dengan Nullkecocokan di tabel kanan.
    • RIGHT JOIN= INNER JOIN+ Data yang tidak cocok dari tabel kanan dengan Nullkecocokan di tabel kiri.
    • FULL JOIN= INNER JOIN+ Data yang tidak cocok pada tabel kanan dan kiri dengan Nullkecocokan.
  • Bergabung sendiri bukan kata kunci dalam SQL, ketika tabel referensi data itu sendiri dikenal sebagai bergabung sendiri. Menggunakan INNER JOINdan OUTER JOINkita dapat menulis permintaan bergabung sendiri.

Sebagai contoh:

SELECT * 
FROM   tablea a 
       INNER JOIN tableb b 
               ON a.primary_key = b.foreign_key 
       INNER JOIN tablec c 
               ON b.primary_key = c.foreign_key 

27

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 JOINalih-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:


4
Tidak mungkin "praktik yang baik" untuk menggunakan satu jenis gabung di atas yang lain. Gabung mana yang Anda gunakan menentukan data yang Anda inginkan. Jika Anda menggunakan yang berbeda Anda salah. Plus, di Oracle setidaknya jawaban ini sepenuhnya salah. Kedengarannya sangat salah untuk semuanya dan Anda tidak punya bukti. Apakah Anda punya bukti?
Ben

1. Maksud saya coba gunakan. Saya melihat banyak orang yang menggunakan LEFT OUTER bergabung di mana-mana tanpa alasan yang jelas. (Kolom yang digabung adalah 'bukan nol'.) Dalam kasus-kasus itu, akan lebih baik menggunakan iner bergabung. 2. Saya telah menambahkan tautan yang menjelaskan perilaku non-asosiatif lebih baik daripada yang saya bisa.
Lajos Veres

Seperti yang saya tahu INNER JOINlebih lambat daripada LEFT JOINdi sebagian besar waktu, Dan orang dapat menggunakan LEFT JOINalih-alih INNER JOINdengan menambahkan WHEREuntuk menghapus NULLhasil yang tidak terduga ;).
shA.t

Komentar-komentar ini membuat saya sedikit tidak pasti. Mengapa menurut Anda INNERlebih lambat?
Lajos Veres

Tergantung pada mesinnya. gnu gabung, joinkeys, DB2, MySQL. Jebakan kinerja berlimpah, seperti pengetikan longgar atau gips eksplisit.
mckenzm

26

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 TableBatau yang OUTER JOINsebenarnya merupakan persatuan daripada gabungan:

masukkan deskripsi gambar di sini


2
Pertanyaannya adalah meminta Perbedaan antara INNER dan OUTER bergabung, tidak harus dibiarkan bergabung dengan lol
LearnByReading

@LearnByReading: foto saya di sebelah kanan adalah join luar kanan yaitu ganti TableA a LEFT OUTER JOIN TableB bdenganTableB B RIGHT OUTER JOIN TableA a
onedaywhen

26

Algoritma yang tepat untuk INNER JOIN, LEFT/RIGHT OUTER JOINadalah sebagai berikut:

  1. Ambil setiap baris dari tabel pertama: a
  2. Pertimbangkan semua baris dari tabel kedua di sampingnya: (a, b[i])
  3. Evaluasi ON ...klausa terhadap setiap pasangan:ON( a, b[i] ) = true/false?
    • Ketika kondisi mengevaluasi true, kembalikan baris gabungan itu (a, b[i]) .
    • Ketika mencapai akhir tabel kedua tanpa kecocokan apa pun, dan ini adalah Outer Joinlalu kembalikan pasangan (virtual) yang digunakan Nulluntuk 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 ONklausa bisa apa saja, tidak diharuskan menggunakan Kunci Utama (dan Anda tidak perlu selalu merujuk ke Kolom dari kedua tabel)! Sebagai contoh:

Gabung Dalam vs Gabung Luar Kiri


masukkan deskripsi gambar di sini

Catatan: Gabung Kiri = Gabung Kiri Luar, Gabung Kanan = Gabung Luar Kanan.


20

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


1
Ini brilian dan menjelaskan mengapa bergabung tidak berfungsi seperti yang diharapkan untuk indeks Time Series. Stempel waktu selisih satu detik tidak tertandingi.
yeliabsalohcin

1
@yeliabsalohcin Anda tidak menjelaskan "seperti yang diharapkan" di sini atau "berfungsi" di komentar Anda pada pertanyaan. Ini hanyalah kesalahpahaman pribadi yang tidak dapat dijelaskan yang anehnya Anda harapkan orang lain miliki. Jika Anda memperlakukan kata-kata dengan sembrono ketika Anda membaca - salah mengartikan tulisan yang jelas dan / atau menerima tulisan yang tidak jelas - seperti ketika Anda menulis di sini, maka Anda dapat memiliki kesalahpahaman. Sebenarnya jawaban ini seperti kebanyakan di sini tidak jelas & salah. "Inner Join: Mengembalikan catatan yang cocok dari kedua tabel" salah ketika set kolom input berbeda. Ia mencoba mengatakan sesuatu, tetapi tidak . (Lihat jawaban saya.)
philipxy

9

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.


5

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:

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

Perhatikan bahwa (1,2,7,8) adalah unik untuk A, (3,4) adalah umum, dan (5,6) unik untuk B.



  • (INNER) GABUNG :

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.

INNER BERGABUNG

select * from a INNER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b;

Hasil:

a | b
--+--
3 | 3
4 | 4


  • LEFT (OUTER) GABUNG :

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.

LEFT JOIN / LEFT OUTER JOIN

select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b(+);

Hasil:

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4
7 | null
8 | null


  • KANAN (OUTER) BERGABUNG : Mengembalikan semua catatan dari tabel kanan, dan catatan yang cocok dari tabel kiri

BERGABUNG DENGAN BENAR / BERGABUNG DENGAN LUAR

select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a(+) = b.b;

Hasil:

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6


  • 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.

BERGABUNG FULL / FULL OUTER JOIN

select * from a FULL OUTER JOIN b on a.a = b.b;

Hasil:

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5
   7 | null
   8 | null

1
Diagram Venn tidak cukup untuk menggambarkan gabungan SQL dalam kasus umum. Gabungan SQL tidak harus mencocokkan baris antara tabel satu-ke-satu, misalnya menggunakan kunci asing vs kunci utama.
Colm Bhandal

Bagaimana Anda bergabung dengan 2 tabel tanpa cocok dengan baris? Anda harus memerlukan kolom utama atau kunci asing atau beberapa bidang umum agar Anda dapat melakukan gabung. Saya bertanya-tanya mengapa Anda menurunkan jawaban ini. Dan diagram Venn adalah sumber untuk menjelaskan cara kerja SQL JOIN. Apakah Anda memiliki contoh yang lebih baik untuk mewakili gabungan? Jika tidak, harap perbarui, agar orang mendapatkan solusi yang lebih baik. Terima kasih.
Mayur

Kaulah yang meletakkan diagram di pos. Apa legenda untuk diagram? - Apa saja elemen dari setiap set? Dan bagaimana dengan fakta bahwa meja bukanlah tas? Kamu tidak mengatakan Satu hal yang tidak mereka set adalah deretan A & B per label. Lihat komentar saya di posting di halaman ini. Posting ini hanya secara buta mengulangi penggunaan yang salah yang terlihat di tempat lain tetapi tidak dipahami atau dipertanyakan. Juga hal-hal yang Anda katakan dalam teks di sini tidak jelas & salah. Juga tidak menambah banyak jawaban yang sudah ada di sini. (Meskipun hampir semua sangat miskin.) PS Tolong jelaskan melalui suntingan, bukan komentar.
philipxy

FK tidak perlu bergabung atau bertanya. Setiap 2 tabel dapat digabungkan dengan kondisi apa pun yang melibatkan kolom mereka & terlepas dari kendala, pemicu, atau pernyataan apa pun.
philipxy

3
  • 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


1
Ini salah dan tidak jelas. Gabung bukan persimpangan kecuali tabel memiliki kolom yang sama. Gabungan luar tidak memiliki baris dari A atau B kecuali jika mereka memiliki kolom yang sama, dalam hal ini tidak ada null yang ditambahkan. Anda mencoba mengatakan sesuatu, tetapi Anda tidak mengatakannya. Anda tidak menjelaskan dengan benar atau jelas.
philipxy

@ philipxy: Tidak setuju pada pernyataan pernyataan Join is not an intersection unless the tables have the same columnsAnda. Anda dapat bergabung dengan kolom apa pun yang Anda inginkan dan jika nilainya cocok, mereka akan bergabung bersama.
SuicideSheep

Komentar itu sama tidak jelasnya dengan jawaban Anda. (Saya kira Anda mungkin berpikir sesuatu seperti, himpunan nilai subrow untuk kolom umum hasilnya adalah perpotongan dari set nilai subrow untuk kolom umum dari masing-masing input; tetapi bukan itu yang Anda tulis. Anda tidak jelas.)
philipxy

Yang saya maksudkan adalah bahwa join hanya persimpangan input ketika itu adalah gabungan natural input dengan kolom yang sama. Anda menggunakan kata "persimpangan" & "penyatuan" secara salah.
philipxy

3

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:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
INNER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

output1

2. Full Outer Join: Disebut juga Full Join. Ini mengembalikan semua baris yang ada di kedua tabel kiri, dan tabel kanan.

Contoh:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
FULL OUTER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

output2

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.

bergabung

Keuntungan Bergabung

  1. Menjalankan lebih cepat.

2
Ini hanya benar ketika tabel memiliki set kolom yang sama. (Ini membingungkan sambungan batin dengan persimpangan & gabungan penuh dengan penyatuan.) Juga "kecocokan" tidak ditentukan. Baca komentar saya yang lain.
philipxy

2

Pertimbangkan di bawah 2 tabel:

EMP

empid   name    dept_id salary
1       Rob     1       100
2       Mark    1       300
3       John    2       100
4       Mary    2       300
5       Bill    3       700
6       Jose    6       400

Departemen

deptid  name
1       IT
2       Accounts
3       Security
4       HR
5       R&D

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:

Select a.empid, a.name, b.name as dept_name
FROM emp a
JOIN department b
ON a.dept_id = b.deptid
;

empid   name    dept_name
1       Rob     IT
2       Mark    IT
3       John    Accounts
4       Mary    Accounts
5       Bill    Security

Seperti yang Anda lihat di atas, Josetidak dicetak dari EMP di output karena dept_id 6tidak menemukan kecocokan di tabel Departemen. Demikian pula, HRdan R&Dbaris 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.

Select a.empid, a.name, b.name as dept_name
FROM emp a
LEFT JOIN department b
ON a.dept_id = b.deptid
;

empid   name    dept_name
1       Rob     IT
2       Mark    IT
3       John    Accounts
4       Mary    Accounts
5       Bill    Security
6       Jose    

Jadi, jika Anda mengamati output di atas, semua catatan dari tabel LEFT (Emp) dicetak hanya dengan catatan yang cocok dari tabel KANAN.

HRdan R&Dbaris 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 .


2

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 JOINdan LEFT OUTER JOIN.

Kedua tabel ini membentuk dasar untuk representasi huruf-huruf JOINdi bawah ini:

Dasar

LINTAS BERGABUNG

CrossJoin

SELECT *
  FROM citizen
 CROSS JOIN postalcode

Hasilnya akan menjadi produk Cartesian dari semua kombinasi. Tidak JOINdiperlukan kondisi:

CrossJoinResult

INNER BERGABUNG

INNER JOIN sama dengan: JOIN

InnerJoin

SELECT *
  FROM citizen    c
  JOIN postalcode p ON c.postal = p.postal

Hasilnya akan berupa kombinasi yang memenuhi persyaratan yang disyaratkan JOIN:

InnerJoinResult

LEFT OUTER BERGABUNG

LEFT OUTER JOIN sama dengan LEFT JOIN

LeftJoin

SELECT *
  FROM citizen         c
  LEFT JOIN postalcode p ON c.postal = p.postal

Hasilnya akan menjadi segalanya dari citizenbahkan jika tidak ada kecocokan di postalcode. Sekali lagi JOINdiperlukan suatu kondisi:

LeftJoinResult

Data untuk diputar

Semua contoh telah dijalankan pada Oracle 18c. Mereka tersedia di dbfiddle.uk yang juga merupakan tempat screenshot dari tabel.

CREATE TABLE citizen (id      NUMBER,
                      name    VARCHAR2(20),
                      postal  NUMBER,  -- <-- could do with a redesign to postalcode.id instead.
                      leader  NUMBER);

CREATE TABLE postalcode (id      NUMBER,
                         postal  NUMBER,
                         city    VARCHAR2(20),
                         area    VARCHAR2(20));

INSERT INTO citizen (id, name, postal, leader)
              SELECT 1, 'Smith', 2200,  null FROM DUAL
        UNION SELECT 2, 'Green', 31006, 1    FROM DUAL
        UNION SELECT 3, 'Jensen', 623,  1    FROM DUAL;

INSERT INTO postalcode (id, postal, city, area)
                 SELECT 1, 2200,     'BigCity',         'Geancy'  FROM DUAL
           UNION SELECT 2, 31006,    'SmallTown',       'Snizkim' FROM DUAL
           UNION SELECT 3, 31006,    'Settlement',      'Moon'    FROM DUAL  -- <-- Uuh-uhh.
           UNION SELECT 4, 78567390, 'LookoutTowerX89', 'Space'   FROM DUAL;

Batas yang kabur saat bermain dengan JOINdanWHERE

LINTAS BERGABUNG

CROSS JOINmenghasilkan baris sebagai The General Idea / INNER JOIN:

SELECT *
  FROM citizen          c
  CROSS JOIN postalcode p
 WHERE c.postal = p.postal -- < -- The WHERE condition is limiting the resulting rows

Menggunakan CROSS JOINuntuk mendapatkan hasil LEFT OUTER JOINmemerlukan trik seperti menambahkan NULLberturut - turut. Itu dihilangkan.

INNER BERGABUNG

INNER JOINmenjadi produk kartesius. Ini sama dengan The General Idea / CROSS JOIN:

SELECT *
  FROM citizen    c
  JOIN postalcode p ON 1 = 1  -- < -- The ON condition makes it a 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 JOINuntuk mendapatkan hasil LEFT OUTER JOINjuga membutuhkan trik. Itu dihilangkan.

LEFT OUTER BERGABUNG

LEFT JOINmenghasilkan baris sebagai The General Idea / CROSS JOIN:

SELECT *
  FROM citizen         c
  LEFT JOIN postalcode p ON 1 = 1 -- < -- The ON condition makes it a CROSS JOIN

LEFT JOINmenghasilkan baris sebagai The General Idea / INNER JOIN:

SELECT *
  FROM citizen         c
  LEFT JOIN postalcode p ON c.postal = p.postal
 WHERE p.postal IS NOT NULL -- < -- removed the row where there's no mathcing result from postalcode

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 Amewakili set di sebelah kiri ( citizentabel) dan set Badalah set di sebelah kanan ( postalcodetabel) dalam diskusi di bawah ini.

LINTAS BERGABUNG

Setiap elemen di kedua set dicocokkan dengan setiap elemen di set lain, artinya kita membutuhkan Ajumlah setiap Belemen dan Bjumlah setiap Aelemen 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 tidak UNIONcocok sama sekali.

Baris berbeda. The UNIONadalah 7 baris total. Tapi mereka tidak kompatibel untuk SQLset hasil yang umum . Dan ini bukan cara CROSS JOINkerjanya sama sekali:

LintasJoinUnion1

Mencoba menampilkannya seperti ini:

CrossJoinUnion2Crossing

..tapi sekarang itu hanya terlihat seperti INTERSECTION, yang tentu saja tidak . Selain itu tidak ada elemen dalam INTERSECTIONyang sebenarnya ada di salah satu dari dua set yang berbeda. Namun, sangat mirip dengan hasil yang dapat dicari yang mirip dengan ini:

PalangJoinUnionUnion3

Untuk referensi, satu hasil yang dapat dicari untuk CROSS JOINs dapat dilihat di Tutorialgateway . The INTERSECTION, seperti yang satu ini, kosong.

INNER BERGABUNG

Nilai suatu elemen tergantung pada JOINkondisinya. Dimungkinkan untuk mewakili ini dengan syarat bahwa setiap baris menjadi unik untuk kondisi itu. Makna id=xhanya berlaku untuk satu baris. Setelah baris dalam tabel A( citizen) cocok dengan beberapa baris dalam tabel B( postalcode) di bawah JOINkondisi, hasilnya memiliki masalah yang sama dengan CROSS 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 bahwa JOINkondisi menentukan penempatan elemen dalam diagram. Melihat hanya pada nilai-nilai JOINkondisi dengan sisa baris hanya untuk perjalanan:

InnerJoinIntersection - Diisi

Representasi ini benar-benar terpisah ketika menggunakan INNER JOINdengan ON 1 = 1kondisi yang membuatnya menjadi CROSS JOIN.

Dengan self JOIN, baris sebenarnya adalah elemen yang identik di kedua tabel, tetapi mewakili tabel sebagai keduanya Adan Btidak terlalu cocok. Sebagai contoh JOINkondisi diri umum yang membuat suatu elemen Amenjadi cocok dengan elemen yang berbeda di B adalah ON A.parent = B.child, membuat kecocokan dari Ake Bpada elemen yang terpisah. Dari contoh-contoh yang akan menjadi SQLseperti ini:

SELECT *
  FROM citizen c1
  JOIN citizen c2 ON c1.id = c2.leader

SelfJoinResult

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 JOINdapat cocok dengan set kosong. Namun dalam teori himpunan penyatuan himpunan mana pun Cdan himpunan kosong, selalu adil C. Set kosong tidak menambahkan apa pun. Representasi ini LEFT OUTER JOINbiasanya hanya menunjukkan semua Auntuk mengilustrasikan bahwa baris Ayang dipilih terlepas dari apakah ada kecocokan atau tidak dari B. Namun "elemen yang cocok" memiliki masalah yang sama dengan ilustrasi di atas. Mereka bergantung pada kondisinya. Dan set kosong tampaknya telah berkeliaran ke A:

LeftJoinIntersection - Diisi

WHERE clause - masuk akal

Menemukan semua baris dari a CROSS JOINdengan Smith dan kode pos di Bulan:

SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE c.name = 'Smith'
   AND p.area = 'Moon';

Di mana - hasil

Sekarang diagram Venn tidak digunakan untuk mencerminkan JOIN. Ini hanya digunakan untuk WHEREklausa:

Dimana

..dan itu masuk akal.

Ketika INTERSECT dan UNION masuk akal

MEMOTONG

Seperti yang dijelaskan, INNER JOINsebenarnya bukan INTERSECT. Namun INTERSECTs 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. Ini SQLakan menghasilkan baris yang sama dengan yang di atas WHERE, dan diagram Venn juga akan sama:

SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE c.name = 'Smith'
INTERSECT
SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE p.area = 'Moon';

PERSATUAN

An OUTER JOINbukan a UNION. Namun UNIONbekerja dalam kondisi yang sama seperti INTERSECT, menghasilkan pengembalian semua hasil menggabungkan kedua SELECTs:

SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE c.name = 'Smith'
UNION
SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE p.area = 'Moon';

yang setara dengan:

SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE c.name = 'Smith'
   OR p.area = 'Moon';

..dan memberikan hasilnya:

Union - Hasil

Juga di sini diagram Venn masuk akal:

PERSATUAN

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:

SELECT *
  FROM citizen
 WHERE name = 'Smith'
SELECT *
  FROM postalcode
 WHERE area = 'Moon';

..mencoba menggabungkan hasil dengan UNIONmemberi a

ORA-01790: expression must have same datatype as corresponding expression

Untuk minat lebih lanjut bacalah Say NO to Venn Diagram When Explaining JOINs dan sql gabung sebagai venn diagram . Keduanya juga menutupi EXCEPT.


1

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 JOINbermuara pada dua kasus:

Untuk SELECTsubset data A:

  • gunakan INNER JOINketika data terkait yang BAnda cari HARUS ada per desain basis data;
  • gunakan LEFT JOINketika data terkait yang BAnda cari MUNGKIN atau MUNGKIN TIDAK ada per desain basis data.

1

Perbedaan antara inner joindan outer joinadalah sebagai berikut:

  1. Inner joinadalah gabungan yang menggabungkan tabel berdasarkan tupel yang cocok, sedangkan outer joingabungan adalah tabel gabungan berdasarkan pada tupel yang cocok dan tidak cocok.
  2. Inner joinmenggabungkan baris yang cocok dari dua tabel di mana baris yang tidak cocok dihilangkan, sedangkan outer joingabungan baris dari dua tabel dan baris yang tidak cocok mengisi dengan nilai nol.
  3. Inner joinseperti operasi persimpangan, sedangkan outer joinseperti operasi serikat.
  4. Inner joinadalah dua jenis, sedangkan outer jointiga jenis.
  5. outer joinlebih cepat dari inner join.

1
Hasil gabungan luar sama dengan gabungan dalam tetapi ditambah beberapa baris tambahan jadi saya tidak tahu mengapa Anda berpikir bergabung luar akan lebih cepat. Juga apakah "dua tipe" dari gabungan batin ini? Saya kira Anda mengacu pada penuh, kiri, dan kanan untuk luar?
Martin Smith

1
@ M.achaibou Tolong jangan mengedit yang membuat perubahan format yang tidak perlu. Nama operator bukan kode kecuali mereka digunakan dalam kode. Tolong jangan membuat perubahan untuk memposting makna, mengirim komentar ke penulis. Jika Anda tidak memiliki perwakilan maka tunggulah sampai Anda melakukannya. Kebetulan poster itu menyetujui hal ini, tetapi tolong jangan melakukan pengeditan seperti itu. Gabung luar PS tidak lebih cepat dari gabung dalam.
philipxy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.