Saya baru mengenal SQL dan ingin tahu apa perbedaan antara kedua JOIN
tipe 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?
Jawaban:
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
NULL
nilai-nilai telepon).sumber
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,
sumber
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 .
sumber
Jika Anda memiliki 2 tabel seperti di bawah ini:
Jika Anda menggunakan Inner Join Anda dapatkan:
Jika Anda menggunakan Full Outer Join, Anda mendapatkan:
Jika Anda menggunakan Left Outer Join, Anda mendapatkan:
sumber
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:
Atau, hasil yang sama dapat diperoleh dengan menggunakan SQL join join operator bersama
COALESCE
, seperti di sini:Catatan tentang Outer Join (4.6) dalam "SQL and Relational Theory: Cara Menulis Kode SQL yang Akurat" oleh CJ Date
sumber
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.
sumber
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.
sumber
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:
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:
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
CASE
pernyataan.Saya harap ini membantu.
sumber