it-swarm.asia

Apa perbedaan antara INNER JOIN dan OUTER JOIN?

Saya baru mengenal SQL dan ingin tahu apa perbedaan antara kedua tipe JOIN ini?

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 satu atau yang lain?

35
Julien
  • gabungan dalam hanya akan memilih catatan di mana kunci gabungan berada di keduanya tabel yang ditentukan.
  • A gabungan luar kiri akan memilih semua catatan dari tabel pertama, dan semua catatan di tabel kedua yang cocok dengan kunci gabungan.
  • A gabungan luar kanan akan memilih semua catatan dari tabel kedua, dan semua catatan di tabel pertama yang cocok dengan kunci yang digabungkan.

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

Pada contoh kedua, Anda akan mengembalikan daftar semua pengguna, ditambah catatan telepon apa pun jika tersedia (jika tidak tersedia, Anda akan mendapatkan NULL untuk telepon nilai).

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

Semoga ini akan membantu Anda memahami,

13
Spredzy

gabungan dalam mengembalikan baris yang dapat digabungkan berdasarkan kriteria gabungan.
Gabung luar mengembalikan ini dan semua baris ...
... dari tabel pertama untuk gabungan kiri
... dari tabel kedua untuk gabung kanan
... dari kedua tabel untuk bergabung penuh

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

8
Leigh Riffel

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

Gabung luar secara khusus dirancang untuk menghasilkan nol dalam hasilnya dan karenanya harus dihindari, secara umum. Berbicara secara internasional, ini semacam perkawinan senapan: Hal itu memaksa meja menjadi semacam persatuan — ya, maksud saya persatuan, tidak bergabung — bahkan ketika tabel yang dipermasalahkan gagal memenuhi persyaratan yang biasa untuk persatuan. 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 operator join luar SQL bersama dengan 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 C.J. Date

6
onedaywhen

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, fun), ( 3, c, bisa)

Gabungan luar kiri dari 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.

5
indyK1ng

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. Dalam SQL Server Anda harus menggunakan pernyataan CASE.

Saya harap ini membantu.

4
AmDB

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.

4
bernd_k