MySQL Gabung: Dalam, Luar, Kiri, Kanan, Silang
โก Ringkasan Cerdas
MySQL JOIN menggabungkan baris dari dua atau lebih tabel yang saling terkait menjadi satu set hasil. Sumber daya ini menjelaskan CROSS, INNER, LEFT, RIGHT, dan OUTER JOIN dengan kueri yang dapat dijalankan, data sampel, dan tabel keluaran yang jelas untuk pekerjaan basis data praktis.

Apa itu GABUNG?
Bergabung membantu mengambil data dari dua atau lebih tabel database.
Tabel-tabel tersebut saling berhubungan menggunakan kunci utama dan kunci asing.
Catatan: JOIN adalah topik yang paling disalahpahami di kalangan pelajar SQL. Demi kesederhanaan dan kemudahan pemahaman, kita akan menggunakan basis data baru untuk berlatih contoh. Seperti yang ditunjukkan di bawah ini.
Setiap contoh di bawah ini menggunakan kedua tabel ini. The film_id kolom masuk anggota menunjuk ke id kolom masuk bioskop โ hubungan yang dicocokkan oleh setiap JOIN.
anggota
| id | nama depan | nama keluarga | film_id |
|---|---|---|---|
| 1 | Adam | Smith | 1 |
| 2 | Ravi | Kumar | 2 |
| 3 | Susan | Davidson | 5 |
| 4 | Jenny | Adrianna | 8 |
| 5 | Lee | Pong | 10 |
bioskop
| id | judul | kategori |
|---|---|---|
| 1 | KEPERCAYAAN ASSASSIN: EMBER | animasi |
| 2 | Baja Asli (2012) | animasi |
| 3 | Alvin and the Chipmunks | animasi |
| 4 | Petualangan Tin Tin | animasi |
| 5 | Aman (2012) | Tindakan |
| 6 | Rumah Aman (2012) | Tindakan |
| 7 | SUDAH | 18 + |
| 8 | Batas waktu 2009 | 18 + |
| 9 | Gambar Kotor | 18 + |
| 10 | aku dan marley | Roman |
Mengapa kita harus menggunakan JOINS?
Sebelum membahas setiap tipe JOIN, ada baiknya mengetahui mengapa JOIN lebih disukai daripada menjalankan beberapa kueri.
Sekarang Anda mungkin berpikir, mengapa kami menggunakan GABUNG ketika kami dapat melakukan tugas yang sama dengan menjalankan kueri. Terutama jika Anda memiliki pengalaman dalam pemrograman database, Anda tahu kami dapat menjalankan kueri satu per satu, gunakan output masing-masing dalam kueri yang berurutan. Tentu saja hal itu mungkin terjadi. Namun dengan menggunakan GABUNG, Anda dapat menyelesaikan pekerjaan hanya dengan menggunakan satu kueri dengan parameter pencarian apa pun. Di samping itu MySQL dapat mencapai kinerja yang lebih baik dengan GABUNG karena dapat menggunakan Pengindeksan. Cukup gunakan satu kueri GABUNG alih-alih menjalankan beberapa kueri akan mengurangi overhead server. Sebaliknya, menggunakan beberapa kueri akan menghasilkan lebih banyak transfer data MySQL dan aplikasi (perangkat lunak). Lebih jauh lagi, ini memerlukan lebih banyak manipulasi data di akhir aplikasi juga.
Jelas bahwa kami bisa mencapai yang lebih baik MySQL dan kinerja aplikasi dengan menggunakan GABUNG.
Jenis-jenis JOIN
MySQL Mendukung beberapa tipe JOIN, masing-masing menjawab pertanyaan berbeda tentang dua tabel yang sama. Tabel di bawah ini membandingkannya; setiap tipe kemudian didemonstrasikan dengan kueri dan hasilnya.
| JOIN tipe | Baris yang dikembalikan | Hasil berisi nilai NULL? | Penggunaan khas |
|---|---|---|---|
| LINTAS BERGABUNG | Setiap baris tabel A dipasangkan dengan setiap baris tabel B. | Tidak | Menghasilkan semua kombinasi yang mungkin |
| INNER JOIN | Hanya baris yang sesuai dengan kondisi di kedua tabel | Tidak | Anggota yang benar-benar menyewa film |
| LEFT JOIN | Semua baris dari tabel sebelah kiri, ditambah pasangan dari sebelah kanan. | Ya, di sisi kanan. | Semua film, bahkan yang tidak pernah disewa. |
| GABUNG BENAR | Semua baris dari tabel sebelah kanan, ditambah pasangan dari sebelah kiri. | Ya, di sisi kiri. | Semua film, bahkan yang tidak ada anggota yang terlibat. |
LINTAS BERGABUNG
Cross JOIN adalah bentuk GABUNG paling sederhana yang mencocokkan setiap baris dari satu tabel database ke semua baris tabel lainnya.
Dengan kata lain ini memberi kita kombinasi setiap baris tabel pertama dengan semua record di tabel kedua.
Misalkan kita ingin mendapatkan semua catatan anggota terhadap semua rekaman film, kita dapat menggunakan skrip di bawah ini untuk mendapatkan hasil yang kita inginkan.
SELECT * FROM `movies` CROSS JOIN `members`
Menjalankan skrip di atas dalam MySQL meja kerja memberi kita hasil sebagai berikut.
| id | title | id | first_name | last_name | movie_id | |
|---|---|---|---|---|---|---|
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 1 | Adam | Smith | 1 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 2 | Ravi | Kumar | 2 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 3 | Susan | Davidson | 5 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 4 | Jenny | Adrianna | 8 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 6 | Lee | Pong | 10 |
| 2 | Real Steel(2012) | Animations | 1 | Adam | Smith | 1 |
| 2 | Real Steel(2012) | Animations | 2 | Ravi | Kumar | 2 |
| 2 | Real Steel(2012) | Animations | 3 | Susan | Davidson | 5 |
| 2 | Real Steel(2012) | Animations | 4 | Jenny | Adrianna | 8 |
| 2 | Real Steel(2012) | Animations | 6 | Lee | Pong | 10 |
| 3 | Alvin and the Chipmunks | Animations | 1 | Adam | Smith | 1 |
| 3 | Alvin and the Chipmunks | Animations | 2 | Ravi | Kumar | 2 |
| 3 | Alvin and the Chipmunks | Animations | 3 | Susan | Davidson | 5 |
| 3 | Alvin and the Chipmunks | Animations | 4 | Jenny | Adrianna | 8 |
| 3 | Alvin and the Chipmunks | Animations | 6 | Lee | Pong | 10 |
| 4 | The Adventures of Tin Tin | Animations | 1 | Adam | Smith | 1 |
| 4 | The Adventures of Tin Tin | Animations | 2 | Ravi | Kumar | 2 |
| 4 | The Adventures of Tin Tin | Animations | 3 | Susan | Davidson | 5 |
| 4 | The Adventures of Tin Tin | Animations | 4 | Jenny | Adrianna | 8 |
| 4 | The Adventures of Tin Tin | Animations | 6 | Lee | Pong | 10 |
| 5 | Safe (2012) | Action | 1 | Adam | Smith | 1 |
| 5 | Safe (2012) | Action | 2 | Ravi | Kumar | 2 |
| 5 | Safe (2012) | Action | 3 | Susan | Davidson | 5 |
| 5 | Safe (2012) | Action | 4 | Jenny | Adrianna | 8 |
| 5 | Safe (2012) | Action | 6 | Lee | Pong | 10 |
| 6 | Safe House(2012) | Action | 1 | Adam | Smith | 1 |
| 6 | Safe House(2012) | Action | 2 | Ravi | Kumar | 2 |
| 6 | Safe House(2012) | Action | 3 | Susan | Davidson | 5 |
| 6 | Safe House(2012) | Action | 4 | Jenny | Adrianna | 8 |
| 6 | Safe House(2012) | Action | 6 | Lee | Pong | 10 |
| 7 | GIA | 18+ | 1 | Adam | Smith | 1 |
| 7 | GIA | 18+ | 2 | Ravi | Kumar | 2 |
| 7 | GIA | 18+ | 3 | Susan | Davidson | 5 |
| 7 | GIA | 18+ | 4 | Jenny | Adrianna | 8 |
| 7 | GIA | 18+ | 6 | Lee | Pong | 10 |
| 8 | Deadline(2009) | 18+ | 1 | Adam | Smith | 1 |
| 8 | Deadline(2009) | 18+ | 2 | Ravi | Kumar | 2 |
| 8 | Deadline(2009) | 18+ | 3 | Susan | Davidson | 5 |
| 8 | Deadline(2009) | 18+ | 4 | Jenny | Adrianna | 8 |
| 8 | Deadline(2009) | 18+ | 6 | Lee | Pong | 10 |
| 9 | The Dirty Picture | 18+ | 1 | Adam | Smith | 1 |
| 9 | The Dirty Picture | 18+ | 2 | Ravi | Kumar | 2 |
| 9 | The Dirty Picture | 18+ | 3 | Susan | Davidson | 5 |
| 9 | The Dirty Picture | 18+ | 4 | Jenny | Adrianna | 8 |
| 9 | The Dirty Picture | 18+ | 6 | Lee | Pong | 10 |
| 10 | Marley and me | Romance | 1 | Adam | Smith | 1 |
| 10 | Marley and me | Romance | 2 | Ravi | Kumar | 2 |
| 10 | Marley and me | Romance | 3 | Susan | Davidson | 5 |
| 10 | Marley and me | Romance | 4 | Jenny | Adrianna | 8 |
| 10 | Marley and me | Romance | 6 | Lee | Pong | 10 |
INNER JOIN
CROSS JOIN mengembalikan setiap kemungkinan pasangan, yang jarang Anda inginkan. INNER JOIN mempersempit hasil ke pasangan yang benar-benar terkait.
JOIN bagian dalam digunakan untuk mengembalikan baris dari kedua tabel yang memenuhi kondisi tertentu.
Misalkan, Anda ingin mendapatkan daftar anggota yang telah menyewa film beserta judul film yang mereka sewa. Anda dapat menggunakan INNER JOIN untuk itu, yang akan mengembalikan baris dari kedua tabel yang memenuhi kondisi yang diberikan.
SELECT members.`first_name` , members.`last_name` , movies.`title` FROM members ,movies WHERE movies.`id` = members.`movie_id`
Menjalankan skrip di atas berikan
| first_name | last_name | title |
|---|---|---|
| Adam | Smith | ASSASSIN'S CREED: EMBERS |
| Ravi | Kumar | Real Steel(2012) |
| Susan | Davidson | Safe (2012) |
| Jenny | Adrianna | Deadline(2009) |
| Lee | Pong | Marley and me |
Perhatikan skrip hasil di atas juga dapat ditulis sebagai berikut untuk mencapai hasil yang sama.
SELECT A.`first_name` , A.`last_name` , B.`title` FROM `members` AS A INNER JOIN `movies` AS B ON B.`id` = A.`movie_id`
GABUNG Luar
INNER JOIN secara diam-diam menghapus baris yang tidak memiliki pasangan. Ketika baris yang tidak berpasangan tersebut penting, OUTER JOIN adalah pilihan yang tepat.
MySQL Outer JOIN mengembalikan semua record yang cocok dari kedua tabel.
Itu dapat mendeteksi catatan yang tidak cocok dalam tabel yang digabungkan. Itu kembali NULL nilai untuk catatan tabel yang digabungkan jika tidak ditemukan kecocokan.
Terdengar membingungkan? Mari kita lihat sebuah contoh โ
LEFT JOIN
Asumsikan sekarang Anda ingin mendapatkan judul semua film beserta nama anggota yang menyewanya. Jelas bahwa beberapa film tidak disewa oleh siapa pun. Kita cukup menggunakan LEFT JOIN untuk tujuan.
LEFT JOIN mengembalikan semua baris dari tabel di sebelah kiri meskipun tidak ada baris yang cocok ditemukan di tabel di sebelah kanan. Jika tidak ditemukan kecocokan pada tabel di sebelah kanan, NULL dikembalikan.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B ON B.`movie_id` = A.`id`
Menjalankan skrip di atas dalam MySQL Workbench memberikan hasil. Anda dapat melihat pada hasil yang dikembalikan yang tercantum di bawah ini bahwa untuk film yang tidak disewa, kolom nama anggota memiliki nilai NULL. Itu berarti tidak ada anggota yang cocok yang ditemukan di tabel anggota untuk film tertentu tersebut.
| title | first_name | last_name |
|---|---|---|
| ASSASSIN'S CREED: EMBERS | Adam | Smith |
| Real Steel(2012) | Ravi | Kumar |
| Safe (2012) | Susan | Davidson |
| Deadline(2009) | Jenny | Adrianna |
| Marley and me | Lee | Pong |
| Alvin and the Chipmunks | NULL | NULL |
| The Adventures of Tin Tin | NULL | NULL |
| Safe House(2012) | NULL | NULL |
| GIA | NULL | NULL |
| The Dirty Picture | NULL | NULL |
GABUNG BENAR
GABUNG KANAN jelas merupakan kebalikan dari GABUNG KIRI. RIGHT JOIN mengembalikan semua kolom dari tabel di sebelah kanan meskipun tidak ada baris yang cocok ditemukan di tabel di sebelah kiri. Jika tidak ditemukan kecocokan pada tabel di sebelah kiri, NULL dikembalikan.
Dalam contoh kita, asumsikan Anda perlu mendapatkan nama anggota dan film yang disewa oleh mereka. Sekarang kami memiliki anggota baru yang belum menyewa film apa pun
SELECT A.`first_name` , A.`last_name`, B.`title` FROM `members` AS A RIGHT JOIN `movies` AS B ON B.`id` = A.`movie_id`
Menjalankan skrip di atas dalam MySQL workbench memberikan hasil sebagai berikut.
| first_name | last_name | title |
|---|---|---|
| Adam | Smith | ASSASSIN'S CREED: EMBERS |
| Ravi | Kumar | Real Steel(2012) |
| Susan | Davidson | Safe (2012) |
| Jenny | Adrianna | Deadline(2009) |
| Lee | Pong | Marley and me |
| NULL | NULL | Alvin and the Chipmunks |
| NULL | NULL | The Adventures of Tin Tin |
| NULL | NULL | Safe House(2012) |
| NULL | NULL | GIA |
| NULL | NULL | The Dirty Picture |
Klausul โONโ dan โUSINGโ.
Setiap kueri sejauh ini telah mencocokkan baris dengan klausa ON. MySQL menawarkan alternatif yang lebih singkat ketika kolom yang cocok memiliki nama yang sama.
Dalam contoh kueri GABUNG di atas, kami telah menggunakan klausa ON untuk mencocokkan catatan antar tabel.
Klausa USING juga dapat digunakan untuk tujuan yang sama. Bedanya dengan MENGGUNAKAN itu perlu memiliki nama yang identik untuk kolom yang cocok di kedua tabel.
Dalam tabel โfilmโ sejauh ini kami menggunakan kunci utamanya dengan nama โidโ. Kami merujuk hal yang sama di tabel โanggotaโ dengan nama โmovie_idโ.
Mari kita ganti nama kolom โfilmโ tabel menjadi โidโ menjadi โmovie_idโ. Kami melakukan ini untuk mendapatkan nama bidang yang sama dan cocok.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Selanjutnya mari kita gunakan USING dengan contoh LEFT JOIN di atas.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B USING ( `movie_id` )
Selain menggunakan ON ke MENGGUNAKAN dengan GABUNG Anda dapat menggunakan banyak lainnya MySQL klausa seperti KELOMPOK OLEH, DI MANA dan bahkan berfungsi seperti JUMLAH, AVG, Dll




