Lebih
SQL BERGABUNG dan berbeda jenis Bergabung
Apa itu SQL JOIN
dan apa yang berbeda jenis?
236
6
Apa itu SQL JOIN
dan apa yang berbeda jenis?
Sebuah ilustrasi dari W3schools:
Apa
SQL JOIN
?SQL JOIN
adalah metode untuk mengambil data dari dua atau lebih tabel database.Apa yang berbeda `SQL BERGABUNG ?
Ada total lima `BERGABUNG. Mereka adalah :
JOIN atau INNER JOIN :
Ini semacam
BERGABUNG
, kita mendapatkan semua catatan yang sesuai dengan kondisi di kedua tabel, dan catatan di kedua tabel yang tidak cocok yang tidak dilaporkan.Dengan kata lain,
INNER JOIN
didasarkan pada satu fakta bahwa: HANYA entri yang cocok di KEDUA tabel HARUS dicantumkan.Perhatikan bahwa
BERGABUNG
tanpaBERGABUNG
kata kunci (sepertiBATIN
,LUAR
,KIRI
, dll) adalah sebuahINNER JOIN
. Dengan kata lain,BERGABUNG
adalah Sintaksis gula untukINNER JOIN
(lihat di: https://stackoverflow.com/questions/565620/difference-between-join-and-inner-join).OUTER JOIN :
OUTER JOIN
mengambilBaik, cocok baris dari satu tabel dan semua baris dalam tabel lainnya Atau, semua baris dalam semua tabel (itu doesn't peduli apakah ada atau tidak ada pertandingan).
Ada tiga jenis Outer Join :
2.1 LEFT OUTER JOIN atau LEFT JOIN
Ini join mengembalikan semua baris dari tabel kiri dalam hubungannya dengan baris yang cocok dari kanan meja. Jika tidak ada kolom yang sesuai di tabel kanan, itu kembali
NULL
nilai-nilai.2.2 RIGHT OUTER JOIN atau RIGHT JOIN
Ini
BERGABUNG
mengembalikan semua baris dari tabel yang tepat dalam hubungannya dengan baris yang cocok dari kiri meja. Jika tidak ada kolom yang sesuai di sebelah kiri meja, itu kembaliNULL
nilai-nilai.2.3 FULL OUTER JOIN atau PENUH BERGABUNG
Ini
BERGABUNG
menggabungkanLEFT OUTER JOIN
danRIGHT OUTER JOIN
. Kembali baris-baris dari tabel ketika kondisi terpenuhi dan mengembalikan nilai "NULL" ketika tidak ada pertandingan.Dengan kata lain,
OUTER JOIN
ini didasarkan pada kenyataan bahwa: HANYA entri yang cocok di salah SATU meja (KANAN atau KIRI) atau KEDUA tabel(FULL) HARUS tercantum.NATURAL JOIN :
Hal ini didasarkan pada dua kondisi :
JOIN
dilakukan pada semua kolom dengan nama yang sama untuk kesetaraan.Hal ini tampaknya menjadi lebih teoritis di alam dan sebagai hasilnya (mungkin) paling DBMS don't bahkan repot-repot untuk mendukung ini.
CROSS JOIN :
Ini adalah produk Cartesian dari dua tabel yang terlibat. Hasil dari
CROSS JOIN
tidak akan masuk akal dalam sebagian besar situasi. Selain itu, kita tidak't perlu ini di semua (atau setidaknya, harus tepat).DIRI BERGABUNG :
Hal ini tidak berbeda bentuk
JOIN
, melainkan merupakanBERGABUNG
(BATIN
,LUAR
, dll) dari sebuah tabel untuk dirinya sendiri.Bergabung berdasarkan Operator
Tergantung pada operator yang digunakan untuk
BERGABUNG
klausa, bisa ada dua jenis `BERGABUNG. MerekaEqui JOIN
Theta JOIN
Equi JOIN :
Untuk apa
BERGABUNG
jenis (BATIN
,LUAR
, dll), jika kita HANYA menggunakan kesetaraan operator (=), maka kita mengatakan bahwaJOIN
adalah sebuahEQUI JOIN
.Theta JOIN :
Ini adalah sama seperti
EQUI JOIN
tapi hal ini memungkinkan semua operator lain seperti >, <, >= dll.Definisi:
BERGABUNG adalah cara untuk query data yang digabungkan bersama-sama dari beberapa tabel secara bersamaan.
Jenis BERGABUNG:
Perhatian untuk RDBMS ada 5-jenis bergabung:
Equi-Join: Menggabungkan umum data dari dua tabel yang didasarkan pada kesetaraan kondisi. Secara teknis, Bergabung dibuat dengan menggunakan persamaan-operator (=) untuk membandingkan nilai-nilai dari Primary Key dari suatu tabel dan Foreign Key nilai-nilai dari tabel lain, maka hasil yang ditetapkan mencakup umum(cocok) catatan dari kedua tabel. Untuk implementasi melihat INNER JOIN.
Alami-Bergabung: Ini adalah versi yang disempurnakan dari Equi-Join, di mana PILIH operasi menghilangkan kolom duplikat. Untuk implementasi melihat DALAM BERGABUNG
Non-Equi-Join: Ini adalah kebalikan dari Equi-join di mana kondisi penggabungan adalah kegunaan lain dari operator yang sama(=) e.g, !=, <=, >=, >, < atau ANTARA dll. Untuk implementasi melihat INNER JOIN.
Self-Join:: disesuaikan perilaku bergabung mana meja dikombinasikan dengan dirinya sendiri; hal Ini biasanya diperlukan untuk query self-referensi tabel (atau Unary relationship entity). Untuk implementasi melihat DALAM Bergabung.
Produk Cartesian: Itu cross menggabungkan semua record dari kedua tabel tanpa kondisi apapun. Secara teknis, ia mengembalikan set hasil query tanpa WHERE Clause.
Sebagai per SQL perhatian dan kemajuan, ada 3 jenis bergabung dan semua RDBMS bergabung dapat dicapai dengan menggunakan jenis bergabung.
INNER JOIN: menyatu(atau menggabungkan) sesuai baris dari dua tabel. Pencocokan ini dilakukan berdasarkan kolom tabel dan membandingkan operasi. Jika kesetaraan berdasarkan kondisi lalu: EQUI-JOIN dilakukan, jika Non-EQUI-Join.
OUTER-JOIN: menyatu(atau menggabungkan) sesuai baris dari dua tabel dan tak tertandingi baris dengan nilai-nilai NULL. Namun, dapat disesuaikan pilihan un-cocok baris e.g, memilih tak tertandingi baris dari tabel pertama atau kedua tabel dengan sub-tipe: LEFT OUTER JOIN dan RIGHT OUTER JOIN.
2.1. LEFT Outer JOIN (a.k.a, KIRI-JOIN): Kembali sesuai baris dari dua tabel dan tak tertandingi dari tabel KIRI(saya.e, tabel pertama) saja.
2.2. RIGHT Outer JOIN (a.k.a, KAN-JOIN): Kembali sesuai baris dari dua tabel dan tak tertandingi dari tabel KANAN saja.
2.3. FULL OUTER JOIN (a.k.sebuah OUTER JOIN): Mengembalikan cocok dan tak tertandingi dari kedua tabel.
![enter image description here][1] Catatan: Self-JOIN dapat dicapai dengan baik INNER JOIN, OUTER JOIN dan CROSS JOIN berdasarkan kebutuhan tapi meja harus bergabung dengan dirinya sendiri.
[Untuk informasi lebih lanjut:][2]
Contoh:
1.1: INNER JOIN: Equi-join pelaksanaan
1.2: INNER JOIN: Alam-BERGABUNG pelaksanaan
1.3: BATIN-BERGABUNG dengan NON-Equi-join pelaksanaan
Menariknya sebagian besar jawaban yang lain menderita dua masalah ini:
Pertama dan terpenting: Bergabung adalah produk cartesian
Ini adalah mengapa diagram Venn menjelaskan mereka jadi tidak akurat, karena BERGABUNG dengan menciptakan produk cartesian antara dua bergabung tabel. Wikipedia menggambarkan hal ini dengan baik: SQL sintaks untuk produk cartesian adalah
CROSS JOIN
. Misalnya:Yang menggabungkan semua baris dari satu tabel dengan semua baris dari tabel lain: Sumber:
Hasilnya:
Jika kita hanya menulis daftar dipisahkan koma dari tabel, kita'll mendapatkan hasil yang sama:
INNER JOIN (Theta-BERGABUNG)
INNER JOIN
hanya disaringCROSS JOIN
di mana filter predikat disebutTheta
dalam aljabar relasional. Misalnya:Perhatikan bahwa kata kunci
INNER
adalah opsional (kecuali di MS Access). (lihat artikel untuk contoh hasil)EQUI JOIN
Jenis khusus dari Theta-BERGABUNG adalah equi JOIN, yang kita gunakan paling. Predikat bergabung dengan primary key dari tabel satu dengan tabel foreign key dari tabel yang lain. Jika kita menggunakan Sakila database sebagai ilustrasi, kita dapat menulis:
Ini menggabungkan semua aktor dengan film-film mereka. Atau juga, pada beberapa database:
MENGGUNAKAN()
sintaks yang memungkinkan untuk menentukan kolom yang harus ada pada kedua sisi JOIN operation's tabel dan menciptakan kesetaraan predikat pada dua kolom.NATURAL JOIN
Jawaban yang lain telah terdaftar ini "BERGABUNG type" secara terpisah, tapi itu doesn't make sense. It's hanya sintaks gula formulir untuk equi JOIN, yang merupakan kasus khusus dari Theta-JOIN atau INNER JOIN. NATURAL JOIN hanya mengumpulkan semua kolom yang umum untuk kedua tabel yang sedang bergabung dan bergabung dengan
MENGGUNAKAN()
kolom tersebut. Yang hampir tidak pernah berguna, karena kebetulan cocok (sepertiLAST_UPDATE
kolom di Sakila database). Berikut ini's sintaks:OUTER JOIN
Sekarang,
OUTER JOIN
sedikit berbeda dariINNER JOIN
karena menciptakanUNION
dari beberapa produk cartesian. Kita dapat menulis:Tidak ada yang ingin menulis yang terakhir, jadi kami menulis
OUTER JOIN
(yang biasanya lebih dioptimalkan dengan database). SepertiBATIN
, kata kunciLUAR
adalah opsional, di sini.OUTER JOIN
datang dalam tiga rasa:KIRI [ OUTER ] JOIN
: meja sebelah kiri dariBERGABUNG
ekspresi ditambahkan ke uni seperti yang ditunjukkan di atas.: tabel kanan dari
BERGABUNG` ekspresi ditambahkan ke uni seperti yang ditunjukkan di atas.PENUH [ OUTER ] JOIN
: Kedua tabelJOIN
ekspresi yang ditambahkan ke uni seperti yang ditunjukkan di atas. Semua ini dapat dikombinasikan dengan kata kunciMENGGUNAKAN()
atau denganALAMI
(I've benar-benar memiliki dunia nyata-kasus penggunaan untukALAM PENUH BERGABUNG
baru-baru ini)Alternatif sintaks
Ada beberapa bersejarah, usang sintaks di Oracle dan SQL Server, yang didukung
OUTER JOIN
sudah sebelum SQL standar memiliki sintaks ini:Setelah berkata begitu, don't menggunakan sintaks ini. Saya baru saja daftar ini di sini sehingga anda dapat mengenalinya dari posting blog lama / lawas kode.
Dipartisi
OUTER JOIN
Sedikit orang yang tahu ini, tapi SQL standar menentukan dipartisi
OUTER JOIN
(dan Oracle menerapkan hal ini). Anda dapat menulis hal-hal seperti ini:Bagian dari hasil:
Intinya di sini adalah bahwa semua baris dari dipartisi sisi bergabung akan berakhir dalam hasil terlepas jika
BERGABUNG
cocok apa-apa pada "di sisi lain BERGABUNG". Singkat cerita: Ini adalah untuk mengisi jarang data dalam laporan. Sangat berguna!SEMI BERGABUNG
Serius? Tidak ada jawaban lain punya ini? Tentu saja tidak, karena itu doesn't memiliki native sintaks SQL, sayangnya (seperti ANTI BERGABUNG di bawah). Tapi kita bisa menggunakan
IN()
danADA()
, misalnya, untuk menemukan semua aktor yang telah bermain dalam film:Yang MANA.actor_id = fa.actor_id
predikat bertindak sebagai semi bergabung predikat. Jika anda don't percaya, memeriksa rencana eksekusi, misalnya di Oracle. Anda'll melihat bahwa database mengeksekusi SEMI BERGABUNG dengan operasi, bukanADA()
predikat.ANTI BERGABUNG
Ini adalah hanya kebalikan dari SEMI BERGABUNG (berhati-hati untuk tidak menggunakan
TIDAK
meskipun, karena memiliki sebuah peringatan penting) Berikut ini adalah semua pelaku tanpa film:Beberapa orang (terutama orang MySQL) juga menulis ANTI BERGABUNG seperti ini:
Saya pikir bersejarah alasan kinerja.
LATERAL BERGABUNG
OMG, yang satu ini juga keren. I'm hanya satu lagi itu? Berikut ini's keren query:
Itu akan menemukan TOP 5 pendapatan memproduksi film per aktor. Setiap kali anda perlu TOP-N-per-sesuatu query,
LATERAL BERGABUNG
akan menjadi teman anda. Jika anda're SQL Server orang, maka anda tahu iniBERGABUNG
jenis di bawah namaAPPLY
OK, mungkin itu's kecurangan, karena
LATERAL BERGABUNG
atauTERAPKAN
ekspresi adalah benar-benar "correlated subquery" yang menghasilkan beberapa baris. Tapi jika kita memungkinkan untuk "berkorelasi subqueries", kita juga bisa berbicara tentang...MULTISET
Ini hanya benar-benar dilaksanakan oleh Oracle dan Informix (untuk pengetahuan saya), tetapi hal ini dapat ditiru di PostgreSQL menggunakan array dan/atau XML dan SQL Server menggunakan XML.
MULTISET
menghasilkan korelasi subquery dan sarang yang dihasilkan set baris di outer query. Di bawah ini query memilih semua aktor dan untuk masing-masing aktor mengumpulkan film-film mereka di bersarang koleksi:Seperti yang anda lihat, ada banyak jenis BERGABUNG dari sekedar "membosankan"
BATIN
,LUAR
, danCROSS JOIN
yang biasanya disebutkan. Lebih detail di artikel saya. Dan tolong, berhenti menggunakan diagram Venn untuk menggambarkan mereka.Saya telah menciptakan sebuah ilustrasi yang menjelaskan lebih baik daripada kata-kata, menurut saya:
I'm akan mendorong hewan peliharaan mengesalkan saya: dengan MENGGUNAKAN kata kunci.
Jika kedua tabel di kedua sisi BERGABUNG dengan mereka foreign key benar bernama (yaitu, nama yang sama, tidak hanya "id) maka hal ini dapat digunakan:
Saya menemukan ini sangat praktis, dapat dibaca, dan tidak digunakan cukup sering.