Apa perbedaan antara gabungan alami dan gabungan batin?
Apa perbedaan antara gabungan alami dan gabungan batin?
Jawaban:
Satu perbedaan signifikan antara INNER JOIN dan NATURAL JOIN adalah jumlah kolom yang dikembalikan.
Mempertimbangkan:
TableA TableB
+------------+----------+ +--------------------+
|Column1 | Column2 | |Column1 | Column3 |
+-----------------------+ +--------------------+
| 1 | 2 | | 1 | 3 |
+------------+----------+ +---------+----------+
The INNER JOIN
dari TableA dan TableB di Column1 akan kembali
SELECT * FROM TableA AS a INNER JOIN TableB AS b USING (Column1);
SELECT * FROM TableA AS a INNER JOIN TableB AS b ON a.Column1 = b.Column1;
+------------+-----------+---------------------+
| a.Column1 | a.Column2 | b.Column1| b.Column3|
+------------------------+---------------------+
| 1 | 2 | 1 | 3 |
+------------+-----------+----------+----------+
The NATURAL JOIN
dari TableA dan TableB di Column1 akan kembali:
SELECT * FROM TableA NATURAL JOIN TableB
+------------+----------+----------+
|Column1 | Column2 | Column3 |
+-----------------------+----------+
| 1 | 2 | 3 |
+------------+----------+----------+
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.
dan b.
bagian tidak akan berada dalam nama kolom, Anda baru saja memiliki column1
, column2
, column1
, column3
sebagai judul. )
NATURAL JOIN
akan rusak, mengapa hal itu tidak terduga, dan di dunia apa Anda berada?
Customers
dan Employees
, bergabung EmployeeID
. Employees
juga memiliki ManagerID
bidang. Semuanya baik. Kemudian, suatu hari, seseorang menambahkan ManagerID
bidang ke Customers
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 karena SELECT * FROM TableA INNER JOIN TableB USING (Column1)
dan SELECT * FROM TableA NATURAL JOIN TableB
sama, keduanya memberikan 3 kolom.
natural left
atau natural 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:
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 adalah tablename_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.
SELECT
*
FROM
table1
NATURAL JOIN
table2
-- implicitly uses `room_number` to join
Sama dengan...
SELECT
*
FROM
table1
INNER JOIN
table2
ON table1.room_number = table2.room_number
Namun, apa yang tidak dapat Anda lakukan dengan format pintasan adalah penggabungan yang lebih rumit ...
SELECT
*
FROM
table1
INNER JOIN
table2
ON (table1.room_number = table2.room_number)
OR (table1.room_number IS NULL AND table2.room_number IS NULL)
NATURAL JOIN ... USING ()
? a NATURAL JOIN b
a JOIN b USING (c)
room_number
, sedangkan gabungan batin Anda akan memiliki dua kolom bernama room_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 dari NATURAL JOIN
dua tabel akan memiliki kolom diduplikasi oleh nama, maka tidak ada kolom anonim. Demikian pula, UNION CORRESPONDING
dan EXCEPT 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 dan VIEW
s :)
Catatan SQL NATURAL JOIN
adalah equi-join **, namun ini bukan bilah kegunaan. Pertimbangkan bahwa jika NATURAL JOIN
hanya tipe join yang didukung dalam SQL, itu akan tetap lengkap secara relasional .
Meskipun memang benar bahwa ada yang NATURAL JOIN
dapat ditulis menggunakan INNER JOIN
dan proyeksi ( SELECT
), juga benar bahwa ada yang INNER JOIN
dapat ditulis menggunakan produk ( CROSS JOIN
) dan pembatasan ( WHERE
); Perhatikan lebih lanjut bahwa NATURAL JOIN
antara tabel tanpa nama kolom yang sama akan memberikan hasil yang sama dengan CROSS JOIN
. Jadi, jika Anda hanya tertarik pada hasil yang berhubungan (dan mengapa tidak ?!) maka NATURAL JOIN
adalah satu-satunya jenis bergabung yang Anda butuhkan. Memang benar bahwa dari perspektif desain bahasa, singkatan seperti INNER 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:
SELECT *
FROM S NATURAL JOIN SP;
-- Must disambiguate and 'project away' duplicate SNO attribute
SELECT S.SNO, SNAME, STATUS, CITY, PNO, QTY
FROM S INNER JOIN SP
USING (SNO);
-- Alternative projection
SELECT S.*, PNO, QTY
FROM S INNER JOIN SP
ON S.SNO = SP.SNO;
-- Same columns, different order == equivalent?!
SELECT SP.*, S.SNAME, S.STATUS, S.CITY
FROM S INNER JOIN SP
ON S.SNO = SP.SNO;
-- 'Old school'
SELECT S.*, PNO, QTY
FROM S, SP
WHERE S.SNO = SP.SNO;
** Gabung natural relasional bukan equijoin, ini adalah proyeksi satu. - philipxy
Sebuah NATURAL
bergabung hanya sintaks singkat untuk tertentu INNER
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 dengan OUTER
( LEFT
/ RIGHT
) atau CROSS
bergabung.
Lihat bagian gabung equi di Wikipedia:
Gabungan alami menawarkan spesialisasi lebih lanjut dari equi-joins. Predikat gabungan muncul secara implisit dengan membandingkan semua kolom di kedua tabel yang memiliki nama kolom yang sama di tabel gabungan .Tabel gabungan yang dihasilkan hanya berisi satu kolom untuk setiap pasangan kolom dengan nama sama.
Sebagian besar ahli sepakat bahwa GABUNGAN ALAMI berbahaya dan karenanya sangat tidak menganjurkan penggunaannya. Bahayanya datang dari tidak sengaja menambahkan kolom baru, dinamai sama dengan kolom lain ...
Artinya, semua NATURAL
bergabung dapat ditulis sebagai INNER
bergabung (tapi sebaliknya tidak benar). Untuk melakukannya, buat saja predikat secara eksplisit - misalnya USING
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 diterapkan LEFT
dan RIGHT
bergabung, dan hal yang sama berlaku. NATURAL LEFT/RIGHT
Gabungan hanyalah sintaks pendek untuk gabungan tertentu LEFT/RIGHT
.)
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
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 =
, <=
, >=
, <
, >
,<>
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.
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.
mysql> SELECT * FROM tb1 ;
+----+------+
| id | num |
+----+------+
| 6 | 60 |
| 7 | 70 |
| 8 | 80 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM tb2 ;
+----+------+
| id | num |
+----+------+
| 4 | 40 |
| 5 | 50 |
| 9 | 90 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
6 rows in set (0.00 sec)
INNER BERGABUNG:
mysql> SELECT * FROM tb1 JOIN tb2 ;
+----+------+----+------+
| id | num | id | num |
+----+------+----+------+
| 6 | 60 | 4 | 40 |
| 7 | 70 | 4 | 40 |
| 8 | 80 | 4 | 40 |
| 1 | 1 | 4 | 40 |
| 2 | 2 | 4 | 40 |
| 3 | 3 | 4 | 40 |
| 6 | 60 | 5 | 50 |
| 7 | 70 | 5 | 50 |
| 8 | 80 | 5 | 50 |
.......more......
return 36 rows in set (0.01 sec)
AND NATURAL JOIN :
mysql> SELECT * FROM tb1 NATURAL JOIN tb2 ;
+----+------+
| id | num |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
3 rows in set (0.01 sec)
Gabung dalam, gabung dua tabel dengan nama kolom yang sama.
Gabung secara alami, gabung dua tabel dengan nama kolom dan tipe data yang sama.