Join Table di Mysql

post ini menjelaskan tentang (cross join, inner join, right join, left join, natural join, join using) yang berlaku di MySQL 5
pada suatu kasus, terdapat tabel sederhana pengguna dengan struktur dan data sebagai berikut tabel pengguna
CREATE TABLE `pengguna` ( `id_pengguna` int(11) NOT NULL auto_increment, `nama` varchar(20) NOT NULL, PRIMARY KEY (`id_pengguna`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
tabel pengguna_lengkap
CREATE TABLE `pengguna_lengkap` ( `id_pengguna` int(11) NOT NULL, `alamat` varchar(50) NOT NULL, `telepon` varchar(15) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
data:
INSERT INTO `pengguna` (`id_pengguna`, `nama`) VALUES (1, 'khalifavi'), (2, 'silvershade'), (3, 'kaelina'); INSERT INTO `pengguna_lengkap` (`id_pengguna`, `alamat`, `telepon`) VALUES (1, 'cigiringsing', '081910435544'), (2, 'cijambe', '022 7815913'), (4, 'tubagus ismail', '022 91724325');
dari data tersebut, dapat kita lihat bahwa pada tabel pengguna, tidak terdapat record dengan id 4, dan begitu pula pada tabel pengguna_lengkap tidak terdapat record dengan id 3. apabila dilakukan join biasa maka beberapa record tidak akan tampil seperti yang kita mau
SELECT * FROM pengguna p, pengguna_lengkap pk WHERE p.id_pengguna = pk.id_pengguna;
hanya akan menampilkan
id_pengguna | nama | id_pengguna | alamat | telepon |
1 | khalivavi | 1 | cigiringsing | 081910435544 |
2 | silvershade | 2 | cijambe |
2 rows in set (0.01 sec) lalu dimana yang memiliki id_pengguna 3 dan 4?, untuk itulah ada beberapa join khusus… untuk menampilkan semua yang terdapat di tabel pengguna namun tidak terdapat di tabel pengguna_lengkap kita bisa menggunakan LEFT JOIN
SELECT * FROM pengguna p LEFT JOIN pengguna_lengkap pk ON p.id_pengguna = pk.id_pengguna;
maka akan menghasilkan hanya akan menampilkan
id_pengguna | nama | id_pengguna | alamat | telepon |
---|---|---|---|---|
1 | khalifavi | 1 | cigiringsing | 081910435544 |
2 | silvershade | 2 | cijambe | 022 7815913 |
3 | kaelina | NULL | NULL | NULL |
3 rows in set (0.01 sec) pada penggunaan LEFT JOIN ini, record yang ada di kedua tabel atau hanya di tabel kiri akan selalu ditampilkan, dan akan menghasilkan nilai NULL pada tabel di kanan begitu pula sebaliknya dengan RIGHT JOIN query ini
SELECT * FROM pengguna p RIGHT JOIN pengguna_lengkap pk ON p.id_pengguna = pk.id_pengguna;
akan menghasilkan
id_pengguna | nama | id_pengguna | alamat | telepon |
---|---|---|---|---|
1 | khalifavi | 1 | cigiringsing | 081910435544 |
2 | silvershade | 2 | cijambe | 022 7815913 |
NULL | NULL | 4 | tubagus ismail | 022 91724325 |
3 rows in set (0.02 sec) digunakan untuk menampilkan record yang ada di kedua tabel atau hanya terdapat di tabel kanan
Note: penggunaan SELECT * pada LEFT atau RIGHT join akan menampilkan column yang redundansi. jadi?? kita lanjut…kan
namun mari kita bandingkan dengan penggunaan NATURAL JOIN
SELECT * FROM pengguna p NATURAL JOIN pengguna_lengkap pk;
id_pengguna | nama | alamat | telepon |
---|---|---|---|
1 | khalifavi | cigiringsing | 081910435544 |
2 | silvershade | cijambe | 022 7815913 |
2 rows in set (0.00 sec) ini sama dengan query pertama
SELECT * FROM pengguna p, pengguna_lengkap pk WHERE p.id_pengguna = pk.id_pengguna;
id_pengguna | nama | id_pengguna | alamat | telepon |
---|---|---|---|---|
1 | khalifavi | 1 | cigiringsing | 081910435544 |
2 | silvershade | 2 | cijambe | 022 7815913 |
2 rows in set (0.01 sec) jadi bisa dikatakan bahwa ini penyederhanaan query pertama, namun menghapus column yang redundansi, hmmm, solusi yang bagus juga…
Note: hasil NATURAL JOIN sama dengan JOIN … USING
<em>SELECT * FROM pengguna p NATURAL JOIN pengguna_lengkap pk;</em>akan menghasilkan output yang sama dengan penggunaan JOIN … USING ini
<em>SELECT * FROM pengguna p JOIN pengguna_lengkap pk USING (id_pengguna);</em>
ok, sekarang kita kombinasikan NATURAL JOIN dengan RIGHT JOIN
SELECT * FROM pengguna p NATURAL RIGHT JOIN pengguna_lengkap pk;
id_pengguna | nama | alamat | telepon |
---|---|---|---|
1 | khalifavi | cigiringsing | 081910435544 |
2 | silvershade | cijambe | 022 7815913 |
4 | NULL | tubagus ismail | 022 91724325 |
3 rows in set (0.00 sec) hmmm, untuk yang ini silahkan bandingkan sendiri… dan mari kita coba INNER JOIN
SELECT * FROM pengguna p INNER JOIN pengguna_lengkap pk ON p.id_pengguna = pk.id_pengguna;
id_pengguna | nama | id_pengguna | alamat | telepon |
---|---|---|---|---|
1 | khalifavi | 1 | cigiringsing | 081910435544 |
2 | silvershade | 2 | cijambe | 022 7815913 |
2 rows in set (0.00 sec) yang satu ini benar-benar mirip dengan query pertama, dan tanpa perbedaan sama sekali…
Note: di MySQL, INNER JOIN dan CROSS JOIN ini serupa (dapat saling menggantikan). namun di SQL Standar ini tidak serupa, INNER JOIN dapat menggunakan ON, tapi tidak dengan CROSS JOIN.
*referensi khalifavi.wordpress.com
This article acivehed exactly what I wanted it to achieve.
aku ijik bingung
Bingungnya di mana mas???