Apa perbedaan antara gabungan alami dan gabungan batin?
sql
join
natural-join
pandai besi
sumber
sumber
Jawaban:
Satu perbedaan signifikan antara INNER JOIN dan NATURAL JOIN adalah jumlah kolom yang dikembalikan.
Mempertimbangkan:
The
INNER JOIN
dari TableA dan TableB di Column1 akan kembaliThe
NATURAL JOIN
dari TableA dan TableB di Column1 akan kembali:Kolom yang berulang dihindari.
(AFAICT dari tata bahasa standar, Anda tidak bisa menentukan kolom bergabung dalam gabungan alami; gabungan itu berdasarkan nama. Lihat juga Wikipedia .)
( Ada cheat di bergabung dalam output; yang
a.
danb.
bagian tidak akan berada dalam nama kolom, Anda baru saja memilikicolumn1
,column2
,column1
,column3
sebagai judul. )sumber
NATURAL JOIN
akan rusak, mengapa hal itu tidak terduga, dan di dunia apa Anda berada?Customers
danEmployees
, bergabungEmployeeID
.Employees
juga memilikiManagerID
bidang. Semuanya baik. Kemudian, suatu hari, seseorang menambahkanManagerID
bidang keCustomers
tabel. Gabung Anda tidak akan rusak (itu akan menjadi rahmat), sebaliknya sekarang akan menyertakan bidang kedua, dan bekerja secara tidak benar . Dengan demikian, perubahan yang tampaknya tidak berbahaya dapat merusak sesuatu yang hanya terkait jarak jauh. SANGAT BURUK. Satu-satunya sisi positif dari gabungan alami adalah menyimpan sedikit pengetikan, dan downside adalah substansial.SELECT * FROM TableA INNER JOIN TableB USING (Column1)
memberi 4 kolom. Ini tidak benar karenaSELECT * FROM TableA INNER JOIN TableB USING (Column1)
danSELECT * FROM TableA NATURAL JOIN TableB
sama, keduanya memberikan 3 kolom.natural left
ataunatural right
) yang mengasumsikan bergabung kriteria untuk berada di tempat kolom yang sama-nama di kedua pertandingan tabelSaya akan menghindari penggunaan gabungan alami seperti wabah, karena gabungan alami adalah:
bukanstandar sql [SQL 92] dankarenanya tidakportabel, tidak dapat dibaca (oleh sebagian besar kode SQL) dan mungkin tidak didukung oleh berbagai alat / pustakasumber
NATURAL JOIN Checkouts
hanya mungkin terjadi ketika konvensi penamaan basis data resmi dan ditegakkan ...."id
mana-mana dan tidak berguna untuk bergabung; nama kunci asing yang biasa adalahtablename_id
. Gabungan alami adalah ide yang buruk, buruk, buruk.Gabung alami hanyalah cara pintas untuk menghindari mengetik, dengan anggapan bahwa gabung itu sederhana dan cocok dengan bidang dengan nama yang sama.
Sama dengan...
Namun, apa yang tidak dapat Anda lakukan dengan format pintasan adalah penggabungan yang lebih rumit ...
sumber
NATURAL JOIN ... USING ()
?a NATURAL JOIN b
a JOIN b USING (c)
room_number
, sedangkan gabungan batin Anda akan memiliki dua kolom bernamaroom_number
.SQL tidak setia pada model relasional dalam banyak hal. Hasil kueri SQL bukan relasi karena mungkin memiliki kolom dengan nama duplikat, kolom 'anonim' (tidak bernama), baris duplikat, nol, dll. SQL tidak memperlakukan tabel sebagai relasi karena bergantung pada pemesanan kolom, dll.
Gagasan
NATURAL JOIN
di balik dalam SQL adalah untuk membuatnya lebih mudah untuk lebih setia pada model relasional. Hasil dariNATURAL JOIN
dua tabel akan memiliki kolom diduplikasi oleh nama, maka tidak ada kolom anonim. Demikian pula,UNION CORRESPONDING
danEXCEPT CORRESPONDING
disediakan untuk mengatasi ketergantungan SQL pada pemesanan kolom dalam warisanUNION
sintaks .Namun, seperti halnya semua teknik pemrograman, diperlukan disiplin agar bermanfaat. Salah satu persyaratan untuk sukses
NATURAL JOIN
adalah kolom yang secara konsisten dinamai, karena gabungan tersirat pada kolom dengan nama yang sama (ini memalukan bahwa sintaks untuk mengganti nama kolom dalam SQL adalah verbose tetapi efek sampingnya adalah mendorong disiplin ketika memberi nama kolom pada tabel dasar danVIEW
s :)Catatan SQL
NATURAL JOIN
adalah equi-join **, namun ini bukan bilah kegunaan. Pertimbangkan bahwa jikaNATURAL JOIN
hanya tipe join yang didukung dalam SQL, itu akan tetap lengkap secara relasional .Meskipun memang benar bahwa ada yang
NATURAL JOIN
dapat ditulis menggunakanINNER JOIN
dan proyeksi (SELECT
), juga benar bahwa ada yangINNER JOIN
dapat ditulis menggunakan produk (CROSS JOIN
) dan pembatasan (WHERE
); Perhatikan lebih lanjut bahwaNATURAL JOIN
antara tabel tanpa nama kolom yang sama akan memberikan hasil yang sama denganCROSS JOIN
. Jadi, jika Anda hanya tertarik pada hasil yang berhubungan (dan mengapa tidak ?!) makaNATURAL JOIN
adalah satu-satunya jenis bergabung yang Anda butuhkan. Memang benar bahwa dari perspektif desain bahasa, singkatan sepertiINNER JOIN
danCROSS JOIN
memiliki nilai mereka, tetapi juga mempertimbangkan bahwa hampir semua permintaan SQL dapat ditulis dalam 10 sintaksis yang berbeda, tetapi secara semantik setara, cara dan inilah yang membuat pengoptimal SQL sangat sulit mengembangkan.Berikut adalah beberapa contoh kueri (menggunakan database suku cadang dan pemasok biasa ) yang secara semantik setara:
** Gabung natural relasional bukan equijoin, ini adalah proyeksi satu. - philipxy
sumber
Sebuah
NATURAL
bergabung hanya sintaks singkat untuk tertentuINNER
bergabung - atau "equi-join" - dan, sekali sintaks yang terbuka, baik mewakili Relational Aljabar operasi yang sama. Ini bukan "jenis yang berbeda" dari bergabung, seperti halnya denganOUTER
(LEFT
/RIGHT
) atauCROSS
bergabung.Lihat bagian gabung equi di Wikipedia:
Artinya, semua
NATURAL
bergabung dapat ditulis sebagaiINNER
bergabung (tapi sebaliknya tidak benar). Untuk melakukannya, buat saja predikat secara eksplisit - misalnyaUSING
atauON
- dan, seperti yang ditunjukkan Jonathan Leffler, pilih kolom set hasil yang diinginkan untuk menghindari "duplikat" jika diinginkan.Selamat coding.
(Kata
NATURAL
kunci juga dapat diterapkanLEFT
danRIGHT
bergabung, dan hal yang sama berlaku.NATURAL LEFT/RIGHT
Gabungan hanyalah sintaks pendek untuk gabungan tertentuLEFT/RIGHT
.)sumber
Natural Join: Ini adalah hasil kombinasi atau gabungan dari semua kolom dalam dua tabel. Ini akan mengembalikan semua baris dari tabel pertama sehubungan dengan tabel kedua.
Gabung Dalam: Gabung ini akan berfungsi kecuali jika salah satu dari nama kolom harus sama dalam dua tabel
sumber
Gabung Alami adalah tempat 2 tabel digabungkan berdasarkan semua kolom umum.
Kolom umum: adalah kolom yang memiliki nama yang sama di kedua tabel + memiliki tipe data yang kompatibel di kedua tabel. Anda hanya dapat menggunakan = operator
Inner Join adalah tempat 2 tabel digabungkan berdasarkan kolom umum yang disebutkan dalam klausa ON.
Kolom umum: adalah kolom yang memiliki tipe data yang kompatibel di kedua tabel tetapi tidak perlu memiliki nama yang sama. Anda dapat menggunakan hanya setiap operator perbandingan seperti
=
,<=
,>=
,<
,>
,<>
sumber
Perbedaannya adalah bahwa di bagian dalam (equi / default) bergabung dan alami bergabung bahwa di kolom umum bergabung natuarl menang akan ditampilkan dalam satu waktu tetapi dalam / equi / default / sederhana bergabung kolom umum akan ditampilkan dua kali.
sumber
Gabung dalam dan gabung alami hampir sama tetapi ada sedikit perbedaan di antara mereka. Perbedaannya adalah pada natural join tidak perlu menentukan kondisi tetapi pada kondisi inner join adalah wajib. Jika kita menentukan kondisi dalam gabungan dalam, tabel yang dihasilkannya seperti produk kartesius.
sumber
INNER BERGABUNG:
sumber
Gabung dalam, gabung dua tabel dengan nama kolom yang sama.
Gabung secara alami, gabung dua tabel dengan nama kolom dan tipe data yang sama.
sumber
NATURAL JOIN
(seperti yang ditunjukkan beberapa orang bertahun-tahun yang lalu) adalah nama kolom yang sama. Tipe data tidak harus sama. Bidang yang digunakan untukINNER JOIN
kebutuhan tidak memiliki nama yang sama.