Sunday, June 21, 2015

MACAM-MACAM JOIN DALAM MYSQL DATABASE

JOIN TABLE DI MYSQL (cross join, inner join, right join, left join, natural join, join using)

Pertama buat sebuah database dengan tabel sebagai berikut :
CREATE TABLE `siswa` (
`id_siswa` int(11) NOT NULL auto_increment,
`nama` varchar(20) NOT NULL,
PRIMARY KEY  (`id_siswa`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
tabel siswa_info
Kemudian buat sebuah tabel lagi dengan nama siswa lengkap.
CREATE TABLE `siswa_info` (
`id_siswa` int(11) NOT NULL,
`alamat` varchar(50) NOT NULL,
`telepon` varchar(15) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Sebagai contoh isi sebagai berikut :
INSERT INTO `siswa` (`id_siswa`, `nama`) VALUES
(1, 'khalifavi'),
(2, 'silvershade'),
(3, 'kaelina');

INSERT INTO `siswa_info` (`id_siswa`, `alamat`, `telepon`) VALUES
(1, 'cigiringsing', '081910435544'),
(2, 'cijambe', '022 7815913'),
(4, 'tubagus ismail', '022 91724325');
Dari isi data tersebut, dapat dilihat bahwa pada tabel siswa, tidak terdapat record dengan id 4, dan begitu pula pada tabel siswa_info tidak terdapat record dengan id 3.
apabila dilakukan join biasa maka beberapa record tidak akan tampil seperti yang di inginkan.
SELECT *
FROM siswa p, siswa_info pk
WHERE p.id_siswa = pk.id_siswa;
Hanya akan menampilkan :
ID_SISWA            NAMA  ID_SISWA            ALAMAT              TELEPON
1              khalifavi               1              cigiringsing          081910435544
2              silvershade         2              cijambe                022 7815913
2 rows in set (0.01 sec)

Lalu dimana yang memiliki id_siswa 3 dan 4?, untuk itulah ada beberapa join khusus.
Untuk menampilkan semua yang terdapat di tabel siswa namun tidak terdapat di tabel siswa_info bisa menggunakan LEFT JOIN
SELECT *
FROM siswa p LEFT JOIN siswa_info pk
ON p.id_siswa = pk.id_siswa;
maka akan menghasilkan,
ID_SISWA            NAMA  ID_SISWA            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 siswaan 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 siswa p RIGHT JOIN siswa_info pk
ON p.id_siswa = pk.id_siswa;
akan menghasilkan, :
ID_SISWA            NAMA  ID_SISWA            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: siswaan SELECT * pada LEFT atau RIGHT join akan menampilkan column yang redundansi. jadi?? Mari lanjutkan.
namun mari bandingkan dengan siswaan NATURAL JOIN
SELECT *
FROM siswa p NATURAL JOIN siswa_info pk;

ID_SISWA            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 siswa p, siswa_info pk
WHERE p.id_siswa = pk.id_siswa;

ID_SISWA            NAMA  ID_SISWA            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
SELECT *
FROM siswa p NATURAL JOIN siswa_info pk;
akan menghasilkan output yang sama dengan siswaan JOIN  USING ini.
SELECT *
FROM siswa p JOIN siswa_info pk USING (id_siswa);
ok, sekarang kombinasikan NATURAL JOIN dengan RIGHT JOIN
SELECT *
FROM siswa p NATURAL RIGHT JOIN siswa_info pk;

ID_SISWA            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 coba INNER JOIN
SELECT *
FROM siswa p INNER JOIN siswa_info pk
ON p.id_siswa = pk.id_siswa;

ID_SISWA            NAMA  ID_SISWA            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.

No comments:

Post a Comment