Apa perbedaan antara INNER JOIN dan OUTER JOIN?

35

Saya baru mengenal SQL dan ingin tahu apa perbedaan antara kedua JOINtipe itu?

SELECT * 
FROM user u
INNER JOIN telephone t ON t.user_id = u.id

SELECT * 
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id

Kapan saya harus menggunakan yang satu atau yang lain?

Julien
sumber
6
apakah ini cocok sebagai pertanyaan DBA? Ini sepertinya lebih merupakan pertanyaan pengkodean bagi saya.
BlackICE
1
@Singkapkan pikiran Anda di Meta
Sathyajith Bhat
@ David maka kemudian VtC jika Anda pikir itu salah untuk situs. Kami selalu dapat membuka kembali.
jcolebrand
3
Saya pikir ini adalah pertanyaan yang bagus, dan sangat sesuai untuk situs tersebut.
datagod
ini perlu dipindahkan dari DBA kecuali DBA noob menyingsingkan untuk menyempurnakan kinerja DB: P
AmDB

Jawaban:

32
  • Gabungan dalam hanya akan memilih catatan di mana kunci gabungan berada di kedua tabel yang ditentukan.
  • Sebuah kiri luar bergabung akan memilih semua record dari tabel pertama, dan setiap catatan dalam tabel kedua yang cocok dengan kunci bergabung.
  • Sebuah luar benar bergabung akan memilih semua record dari tabel kedua, dan setiap catatan dalam tabel pertama yang cocok dengan kunci bergabung.

Dalam contoh pertama Anda, Anda hanya akan mengembalikan daftar pengguna dan nomor telepon jika setidaknya ada satu catatan telepon untuk pengguna.

Dalam contoh kedua, Anda akan mengembalikan daftar semua pengguna, ditambah catatan telepon apa pun jika tersedia (jika tidak tersedia, Anda akan mendapatkan NULLnilai-nilai telepon).

LittleBobbyTables
sumber
13

Setiap kali seseorang mengajukan pertanyaan ini, ada jawabannya: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

Semoga itu akan membantu Anda memahami,

Spredzy
sumber
3
Saya telah bekerja dengan penggabungan selama 20 tahun dan diagram itu hanya membingungkan saya.
Hogan
3
Saya dengan @Hogan - diagram ven bukan penjelasan terbaik untuk ini .. kotak yang menunjukkan kombinasi apa yang akan dikembalikan kemungkinan akan lebih baik.
Joe
Semua yang ditampilkan adalah Anda tidak mengerti diagram venn. Mereka benar-benar berhubungan dengan jenis-jenis bergabung tetapi ingatlah bahwa mereka adalah alat untuk membantu memahami bagi mereka yang baru bergabung. Jika Anda sudah belajar bergabung dengan konsep yang berbeda dalam pikiran maka itu pasti terlihat asing bagi Anda. Itu tidak masalah, tetapi juga bukan indikator yang baik untuk kegunaan diagram.
JamesRyan
@jamesryan itu tidak benar, mereka tidak berhubungan dengan sempurna, gabungan mirip dengan produk set kartesian, bukan persimpangan dan gabungan, diagram venn analog hanya berfungsi jika Anda bergabung dengan kunci unik, jika Anda memiliki kunci duplikat maka Anda kehilangan aspek produk kartesius.
Akan
1
Saya sangat tidak setuju, diagram Venn sudah memiliki interpretasi yang sangat baik, mengatur persimpangan dan kesatuan. Bergabung tidak cocok dengan interpretasi ini ketika Anda bergabung dengan kunci yang tidak unik. Saya pikir Anda menafsirkan diagram venn terlalu luas.
Will
8

Sebuah bergabung dalam pengembalian baris yang dapat dikombinasikan berdasarkan kriteria bergabung.
Sebuah luar bergabung kembali ini dan semua baris ...
   ... dari tabel pertama untuk kiri bergabung
   ... dari tabel kedua untuk benar bergabung
   ... dari kedua tabel untuk penuh bergabung

Memilih kapan harus menggunakan satu atau yang lain adalah masalah menentukan data apa yang Anda butuhkan. Sebagai contoh Anda jika Anda hanya perlu catatan yang memiliki user_ids dari telepon yang cocok dengan id di pengguna kemudian gunakan gabungan dalam. Jika Anda juga ingin memasukkan baris dari pengguna yang tidak memiliki entri telepon yang cocok, maka sambungan kiri akan sesuai.

Untuk informasi lebih lanjut lihat pertanyaan ini di StackOverflow .

Leigh Riffel
sumber
7

Jika Anda memiliki 2 tabel seperti di bawah ini:

Table1 :   A1    B1          Table2  :    B2     C2 
           -     -                        -      -
           1     2                        1      1
           2     4                        2      4
           3     5                        5      2

Jika Anda menggunakan Inner Join Anda dapatkan:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2

Jika Anda menggunakan Full Outer Join, Anda mendapatkan:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL
NULL   NULL    1       1

Jika Anda menggunakan Left Outer Join, Anda mendapatkan:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL
Am1rr3zA
sumber
6

Gabung luar secara khusus dirancang untuk menghasilkan nol dalam hasilnya dan karenanya harus dihindari, secara umum. Berbicara secara internasional, ini semacam perkawinan senapan: Ini memaksa meja menjadi semacam persatuan — ya, maksud saya persatuan, tidak bergabung — bahkan ketika tabel tersebut gagal memenuhi persyaratan perserikatan yang biasa. Ini melakukan ini, pada dasarnya, dengan melapisi satu atau kedua tabel dengan nol sebelum melakukan penyatuan, dengan demikian membuat mereka sesuai dengan persyaratan yang biasa. Tapi tidak ada alasan mengapa padding itu tidak boleh dilakukan dengan nilai yang benar, bukan nol, seperti dalam contoh ini:

SELECT SNO , PNO 
FROM   SP 
UNION  
SELECT SNO , 'nil' AS PNO 
FROM   S 
WHERE  SNO NOT IN ( SELECT SNO FROM SP )

Atau, hasil yang sama dapat diperoleh dengan menggunakan SQL join join operator bersama COALESCE, seperti di sini:

SELECT SNO , COALESCE ( PNO , 'nil' ) AS PNO 
FROM ( S NATURAL LEFT OUTER JOIN SP ) AS TEMP

Catatan tentang Outer Join (4.6) dalam "SQL and Relational Theory: Cara Menulis Kode SQL yang Akurat" oleh CJ Date

suatu hari nanti
sumber
5

Gabungan dalam adalah gabungan di mana satu-satunya hasil yang ditampilkan adalah hasil di mana kunci berada di kedua tabel. Gabungan luar akan menampilkan hasil untuk semua kunci dalam satu tabel, gabungan kiri dari yang pertama dan gabungan kanan dari yang kedua. Sebagai contoh:

Katakanlah table1 memiliki pasangan kunci dan data primer berikut: (1, a), (2, b), (3, c)

Katakan juga table2 memiliki pasangan kunci dan data primer berikut: (1, kesenangan), (3, bisa), (4, terjadi)

Jadi gabungan batin table1 ke table2 pada kunci primer akan menghasilkan kembar tiga yang dihasilkan berikut (dengan kunci primer umum pertama, item kedua tabel pertama kedua dan ketiga item kedua tabel kedua): (1, a, menyenangkan), ( 3, c, bisa)

Gabungan luar kiri table1 ke table2 pada kunci primer akan menghasilkan kembar tiga yang dihasilkan berikut (format yang sama seperti di atas): (1, a, menyenangkan), (2, b, NULL), (3, c, dapat)

Gabungan luar kanan table1 ke table2 pada kunci primer akan menghasilkan kembar tiga yang dihasilkan berikut (format yang sama seperti di atas): (1, a, menyenangkan), (3, c, bisa), (4, NULL, terjadi)

Saya harap ini menjelaskan konsep dengan baik.

indyK1ng
sumber
4

Biarkan saya mencoba menggambarkannya sedikit lebih intuitif.

Gabungan dalam menunjukkan pengguna, yang memiliki satu atau lebih telepon bersama-sama dengan nomor telepon mereka.

Bagian luar kiri bergabung juga daftar 'pengguna' yang tidak memiliki telepon.

bernd_k
sumber
4

Karena Anda telah bertanya kapan harus menggunakan apa, berikut adalah skenario dengan kueri - pilih yang akan digunakan tergantung pada kebutuhan.

Data:

Tabel Pengguna memiliki 10 catatan. Tabel Phoneno memiliki 6 catatan (dengan relasi 1: 1, yang berarti bahwa entri di PhoneNo akan mereferensikan hanya satu entri di Pengguna, dan hanya satu entri di PhoneNo yang dapat mereferensikan entri yang diberikan pada Pengguna).

Persyaratan 1: Tampilkan semua pengguna dengan nomor telepon mereka. Abaikan pengguna tanpa nomor telepon.

Pertanyaan:

SELECT u.uid, u.name, p.phonno 
  FROM user u 
INNER JOIN phones p ON p.uid = u.uid

Hasil: menunjukkan 6 pengguna yang memiliki nomor telepon

Persyaratan 2: Tampilkan semua pengguna dengan nomor telepon mereka. Jika pengguna tidak memiliki tampilan telepon 'N / A' (tidak tersedia)

Pertanyaan:

SELECT u.uid, u.name, ifnull(p.phonno,'N/A') 
  FROM user u 
LEFT OUTER JOIN phones p ON p.uid = u.uid

Hasil:

Menampilkan semua 10 catatan

Catatan: ifnull adalah sintaks MySql untuk mengubah nilai nol. Saya menggunakan fungsi ini untuk membuat mesin db menunjukkan 'N / A' ketika phonno nol. Cari fungsi yang sesuai jika Anda menggunakan beberapa DBMS lainnya. Di SQL Server Anda harus menggunakan CASEpernyataan.

Saya harap ini membantu.

AmDB
sumber