saya akan mencoba membahas bagaimana cara membuat query SQL yang
melibatkan tabel lebih dari satu (multi tabel) dimana saling berelasi
satu sama yang lain. Dalam hal ini, pembahasan hanya akan berfokus pada
query berbentuk SELECT saja.
Untuk lebih jelasnya, saya berikan sampel 3 buah tabel yang saling
berelasi satu sama lain beserta sampel datanya. Tabel ini merupakan
studi kasus dari data perkuliahan mahasiswa.
CREATE TABLE `ambilmk` (
`nim` varchar(5),
`kodemk` varchar(4),
`nilai` float,
`smt` varchar(10),
`thajar` varchar(10),
PRIMARY KEY (`nim`,`kodemk`)
);
CREATE TABLE `mhs` (
`nim` varchar(5),
`namamhs` varchar(20),
`alamat` text,
`tgllhr` date,
PRIMARY KEY (`nim`)
);
CREATE TABLE `mk` (
`kodemk` varchar(4),
`namamk` varchar(20),
`sks` int(11),
`smt` varchar(10),
PRIMARY KEY (`kodemk`)
);
dan… berikut ini adalah sampel datanya
INSERT INTO `ambilmk` VALUES ('M001', 'MK01', '3', 'GANJIL', '2001-2002');
INSERT INTO `ambilmk` VALUES ('M001', 'MK02', '2', 'GANJIL', '2001-2002');
INSERT INTO `ambilmk` VALUES ('M002', 'MK01', '4', 'GANJIL', '2001-2002');
INSERT INTO `ambilmk` VALUES ('M003', 'MK03', '4', 'GENAP', '2001-2002');
INSERT INTO `mhs` VALUES ('M001', 'XXX', 'SOLO', '1990-10-01');
INSERT INTO `mhs` VALUES ('M002', 'YYY', 'SEMARANG', '1992-08-11');
INSERT INTO `mhs` VALUES ('M003', 'ZZZ', 'SOLO', '1991-04-15');
INSERT INTO `mk` VALUES ('MK01', 'KALKULUS I', '3', 'GANJIL');
INSERT INTO `mk` VALUES ('MK02', 'GEOMETRI', '2', 'GANJIL');
INSERT INTO `mk` VALUES ('MK03', 'KALKULUS II', '3', 'GENAP');
Berdasarkan ketiga tabel tersebut, kita bisa melihat relasi antar
ketiga tabel tersebut sebagaimana tergambar pada gambar berikut ini
Nah… selanjutnya, misalkan kita ingin menampilkan data mahasiswa
(nim, nama) dari mahasiswa yang pernah mengambil matakuliah ‘MK01′.
Bagaimana cara membuat query SQL nya?
Sebelum kita mulai membuat query SQL nya, terlebih dahulu harus kita tentukan ‘Di tabel manakah kita akan bekerja‘
dari ketiga tabel tersebut. OK… untuk menampilkan nim dan nama, kita
bisa menggunakan tabel ‘mhs’. Sedangkan untuk prasyarat dari query yaitu
‘mahasiswa yang pernah mengambil matakuliah MK01 kita menggunakan tabel
‘ambilmk’. Dengan demikian query yang akan kita buat hanya melibatkan
kedua tabel tersebut, yaitu ‘mhs’ dan ‘ambilmk’.
Eh… masih ada lagi hal yang harus diperhatikan, yaitu relasi kedua
tabel tersebut. Bila Anda lihat gambar relasi di atas atau hubungan
antar ketiga tabel, tabel ‘ambilmk’ dan tabel ‘mhs’ direlasikan melalui
field apa? Dari gambar, kita tahu bahwa kedua tabel terhubung melalui
field ‘nim’ yang ada di tabel ‘mhs’ dan field ‘nim’ yang ada di tabel
‘ambilmk’. Oleh karena itu di dalam query SQL terutama pada bagian
klausa WHERE perlu adanya perintah untuk menggambarkan hubungan
tersebut.
Query SQL untuk menampilkan data mahasiswa (nim, nama) dari mahasiswa yang pernah mengambil matakuliah ‘MK01′ adalah sbb:
SELECT mhs.nim, mhs.namamhs
FROM mhs, ambilmk
WHERE mhs.nim = ambilmk.nim AND ambilmk.kodemk = 'MK01';
Perhatikan perintah “mhs.nim = ambilmk.nim” pada query di atas.
Perintah tersebut digunakan untuk merelasikan tabel ‘mhs’ dengan
‘ambilmk’ dimana kedua tabel terhubung oleh field ‘nim’ yang ada di
masing-masing tabel.
Sehingga hasil dari query SQL di atas adalah
Selanjutnya misalkan kita ingin menampilkan data mahasiswa (nim,
nama) beserta nilainya dari mahasiswa yang pernah mengambil matakuliah
bernama ‘KALKULUS I’. Bagaimana query SQL nya?
OK… langkah pertama, kita tentukan dulu tabel mana saja yang kita
pilih. Untuk menampilkan nim dan nama, kita butuh tabel ‘mhs’. Nilai,
kita butuh tabel ‘ambilmk’. Sedangkan nama matakuliah ‘KALKULUS I’ yang
digunakan sebagai syarat, kita dapatkan dari tabel ‘mk’. Jadi untuk
query ini, kita butuh ketiga tabel semuanya.
Setelah itu, kembali lagi kita lihat gambar relasi ketiga tabel di
atas. Tabel ‘mhs’ dan ‘ambilmk’ dihubungkan dengan field ‘nim’ yang ada
pada keduanya. Sedangkan tabel ‘mk’ dan ‘ambilmk’ terhubung oleh field
‘kodemk’ yang juga ada pada keduanya. Nah… selanjutnya kita bisa membuat
query SQL nya
SELECT mhs.nim, mhs.namamhs, ambilmk.nilai
FROM mhs, ambilmk, mk
WHERE mhs.nim = ambilmk.nim AND mk.kodemk = ambilmk.kodemk AND mk.namamk = 'KALKULUS I';
Perhatikan query SQL di atas, perintah “mhs.nim = ambilmk.nim AND
mk.kodemk = ambilmk.kodemk” menunjukkan relasi ketiga tabel. Gunakan
operator AND bila relasi tabelnya lebih dari 1 buah. Dan… kedua perintah
relasi bisa dibolak-balik (“mk.kodemk = ambilmk.kodemk AND mhs.nim =
ambilmk.nim”) karena sifat operasi AND adalah komutatif.
Hasil dari query tersebut adalah
Trus… mungkin ada yang bertanya lagi… bagaimana jika query relasi tabelnya
dijalankan di script PHP? Ya… caranya sama saja, Anda tinggal jalankan
query SQL untuk relasi tabel di dalam script PHP nya. Dalam hal ini
relasi tabel tetap ditentukan oleh query SQL nya.
Sebagai contoh, script PHP di bawah ini akan menampilkan hasil dari query terakhir di atas.
<?php
mysql_connect("dbhost", "dbuser", "dbpass");
mysql_select_db("dbname");
$query = "SELECT mhs.nim, mhs.namamhs, ambilmk.nilai
FROM mhs, ambilmk, mk
WHERE mhs.nim = ambilmk.nim AND mk.kodemk = ambilmk.kodemk
AND mk.namamk = 'KALKULUS I'";
$hasil = mysql_query($query);
echo "<table border='1'>";
echo "<tr><td>NIM</td><td>Nama Mhs</td><td>Nilai</td></tr>";
while ($data = mysql_fetch_array($hasil))
{
echo "<tr><td>".$data['nim']."</td><td>".$data['namamhs']."</td><td>".$data['nilai']."</td></tr>";
}
echo "</table>";
?>
dan hasilnya…
dengan demikian, saya ulangi lagi bahwa dalam hal ini relasi tabel
dilakukan di dalam query SQL nya dan tidak di PHP nya. Script PHP hanya
menjalankan query, memfetching data hasil query dan kemudian
menampilkannya di browser.