Escolar Documentos
Profissional Documentos
Cultura Documentos
terdiri dari beberapa tabel. Masing-masing tabel tersebut dapat berhubungan (berelasi) satu sama lain. Relasi antar-tabel dapat berupa relasi 1-1 (one-to-one), 1-M (one-tomany), atau M-N (many-to-many). Sebagai contoh terlihat pada gambar pemodelan data konseptual (class diagram) di bawah ini. Tabel pelanggan berhubungan dengan pesan, pesan dengan barang, dsb. Pada pembuatan suatu aplikasi, terkadang kita juga memerlukan tampilan data yang tidak hanya berasal dari 1 (satu) tabel, namun bisa dari beberapa tabel sekaligus. Contohnya, dari class diagram di bawah, kita ingin menampilkan nama pelanggan berikut transaksi yang pernah dilakukannya. Dari contoh tersebut, kita harus bisa menggabungkan minimal dua tabel, yaitu pelanggan dan pesan. Untuk menggabungkan 2 (dua) atau lebih tabel, kita dapat menggunakan bentuk perintah JOIN. Dalam tutorial ini, akan dijelaskan secara bertahap mengenai bagaimana menggabungkan dua tabel atau lebih, terutama untuk menampilkan data yang berasal dari beberapa tabel. Contoh-contoh dalam tutorial ini secara khusus telah dicoba di database MySQL, namun demikian secara umum perintah penggabungan tabel di semua jenis database tidak jauh berbeda alias sama. Sebelum belajar mengenai perintah penggabungan tabel, perlu dipersiapkan tabel-tabel yang akan dijadikan sebagai bahan latihan dan contoh dalam tutorial ini. Kita akan menggunakan tabel rancangan sistem pemesanan barang (pembelian) sederhana berikut ini. Untuk membuatnya, Anda dapat menggunakan tools seperti PHPMyAdmin dan MySQLFront atau dapat juga melalui command-prompt. Jika diperlukan, pelajari kembali postingan saya sebelumnya mengenai administrasi database MySQL dengan PHPMyAdmin dan juga dasar-dasar perintah SQL. Jangan lupa isikan beberapa contoh data ke tabel-tabel yang sudah Anda buat.
1. Inner Join
Dengan inner join, tabel akan digabungkan dua arah, sehingga tidak ada data yang NULL di satu sisi. Sebagai contoh, kita akan menggabungkan tabel pelanggan dan pesan dimana kita akan menampilkan daftar pelanggan yang pernah melakukan pemesanan (transaksi). Misalkan isi tabel pelanggan dan pesan adalah sebagai berikut : Tabel pelanggan (hanya ditampilkan field id_pelanggan, nm_pelanggan dan email)
Contoh isi tabel pesan Cara #1. Inner Join dengan WHERE. Penggabungan dengan klausa WHERE memiliki bentuk umum sebagai berikut:
SELECT tabel1.*, tabel2.* FROM tabel1, tabel2 WHERE tabel1.PK=tabel2.FK;
Berikut ini perintah SQL untuk menggabungkan tabel pelanggan dan pesan:
SELECT pelanggan.id_pelanggan, pelanggan.nm_pelanggan, pesan.id_pesan, pesan.tgl_pesan FROM pelanggan, pesan WHERE pelanggan.id_pelanggan=pesan.id_pelanggan;
Hasil Penggabungan 2 Tabel dengan WHERE Pada hasil perintah query di atas terlihat bahwa terdapat 5 (lima) transaksi yang dilakukan oleh 3 (tiga) orang pelanggan. Jika kita lihat kembali isi tabel pelanggan di atas, maka terdapat satu pelanggan yang tidak ditampilkan yaitu yang memiliki id pelanggan P0003. Pelanggan tersebut tidak ditampilkan karena belum pernah melakukan transaksi. Cara #1. Inner Join dengan klausa INNER JOIN. Berikut ini bentuk umumnya:
SELECT tabel1.*, tabel2.* FROM tabel1 INNER JOIN tabel2 ON tabel1.PK=tabel2.FK;
Dan berikut ini perintah SQL penggabungan tabel pelanggan dan pesan.
SELECT pelanggan.id_pelanggan, pelanggan.nm_pelanggan, pesan.id_pesan, pesan.tgl_pesan FROM pelanggan INNER JOIN pesan ON pelanggan.id_pelanggan=pesan.id_pelanggan;
2. Outer Join
Dengan outer join, tabel akan digabungkan satu arah, sehingga memungkinkan ada data yang NULL (kosong) di satu sisi. Sebagai contoh, kita akan menggabungkan tabel pelanggan dan pesan dimana kita akan menampilkan daftar pelanggan yang pernah melakukan pemesanan (transaksi).
Outer Join terbagi menjadi 2 (dua) yaitu LEFT JOIN dan RIGHT JOIN. Berikut ini bentuk umum dan contohnya: LEFT JOIN. Bentuk umum:
SELECT tabel1.*, tabel2.* FROM tabel1 LEFT JOIN tabel2 ON tabel1.PK=tabel2.FK;
Hasilnya:
Hasil Perintah Left Join Berbeda dengan hasil sebelumnya (inner join), penggunaan left join akan menampilkan juga data pelanggan dengan id P0003, walaupun pelanggan tersebut belum pernah bertransaksi. Dan pada kolom id_pesan dan tgl_pesan untuk pelanggan P0003 isinya NULL, artinya di tabel kanan (pesan) pelanggan tersebut tidak ada. RIGHT JOIN Bentuk umum:
SELECT tabel1.*, tabel2.* FROM tabel1 RIGHT JOIN tabel2 ON tabel1.PK=tabel2.FK;
SELECT pelanggan.id_pelanggan, pelanggan.nm_pelanggan, pesan.id_pesan, pesan.tgl_pesan FROM pelanggan RIGHT JOIN pesan ON pelanggan.id_pelanggan=pesan.id_pelanggan;
Hasilnya:
Hasil Perintah Right Join Dengan right join, tabel yang menjadi acuan adalah tabel sebelah kanan (tabel pesan), jadi semua isi tabel pesan akan ditampilkan. Jika data pelanggan tidak ada di tabel pelanggan, maka isi tabel pesan tetap ditampilkan.
22. <td><?php echo $buku['isbn'];?></td> 23. <td><?php echo $buku['tgl_terbit'];?></td> 24. </tr> 25. <?php }?> 26. </table>
Kode untuk menampilkan data dari beberapa tabel di atas hampir sama dengan cara menampilkan data dari satu tabel. Perbedaannya hanya pada baris ke-4, pada baris ke-4 menggunakan sql join.
while($lagu = mysql_fetch_array($rowset)){ ?> <tr> <td style="border-bottom:1px solid #000; borderright:1px solid #000"><?php echo $lagu['no_track'];?></td> 32. <td style="border-bottom:1px solid #000; borderright:1px solid #000"><?php echo $lagu['judul'];?></td> 33. <td style="border-bottom:1px solid #000"><?php echo $lagu['durasi'];?></td> 34. </tr> 35. <?php }?> 36. </table> 37. </td> 38. </tr> 39. <?php }?> 40. </table>
bisa dilihat kode di atas hampir sama dengan kode untuk menampilkan data dari satu tabel. Perbedaanya adalah pada baris 17-38. Baris 17-38 adalah untuk menampilkan lagu berdasarkan id_album album yang sedang ditampilkan.
<td><?php echo $mhs['nama'];?></td> <td><?php echo $mhs['jurusan'];?></td> <td><a href="mahasiswa_mk.php?nim=<?php echo $mhs['nim'];?>">Tambah Mata Kuliah</a></td> 20. </tr> 21. <tr> 22. <td colspan="4"> 23. <strong>Mata Kuliah:</strong> 24. <table cellspacing="0" cellpadding="5" width="100%"> 25. <tr> 26. <td style="border-bottom:1px solid #000;">Kode MK</td> 27. <td style="border-bottom:1px solid #000;">Nama MK</td> 28. </tr> 29. <?php 30. $rowset = mysql_query("select * from mahasiswa_mk m inner join 31. mata_kuliah m1 on m.id_mk=m1.id where nim='".$mhs['nim']."'"); 32. while($mk = mysql_fetch_array($rowset)){ 33. ?> 34. <tr> 35. <td style="border-bottom:1px solid #000;borderright:1px solid #000"><?php echo $mk['kode'];?></td> 36. <td style="borderbottom:1px solid #000;"><?php echo $mk['nama'];?></td> 37. </tr> 38. <?php }?> 39. </table> 40. </td> 41. </tr> 42. <?php }?> 43. </table>
tabel yang berelasi. Baik itu tabel dengan relasi one-to-one atau satu-ke-satu, one-to-many atau satu-ke-banyak dan many-to-many atau banyak-ke-banyak. Sebenarnya tidak ada trik atau cara khusus saat menyimpan data ke beberapa table, begitu pula dengan menampilkan data dari beberapa table. Selama memahami cara memproses HTML form yang benar dan memahami cara menyimpan & menampilkan data ke satu tabel.
One-to-one Satu-ke-satu
Relasi one-to-one merupakan relasi tabel yang jarang digunakan, relasi ini merelasikan satu data sebuah tabel dengan hanya satu data dari tabel lainnya. Indikasi untuk menggunakan tipe relasi ini adalah jika sebuah data memiliki sebuah subset data tertentu yang menerangkan lebih detil data itu, dimana subset data ini tidak dimiliki oleh data tersebut pada umumnya. Sebagai contoh, sebuah product secara umum memiliki id_produk, nama, harga, jenis. Namun pada tipe product tertentu seperti buku, memiliki data tambahan seperti penulis, penerbit, ISBN, tanggal_terbit. Satu data di tabel product hanya terhubung dengan satu data di tabel buku. Jika digambarkan seperti di bawah.
One-to-many Satu-ke-banyak
Relasi one-to-many adalah relasi antar dua tabel dimana satu data (record) dari Tabel 1 bisa terhubung dengan beberapa record di Tabel 2. Misalnya penjualan memiliki id_penjualan, tanggal_jual, kasir. Setiap penjualan bisa terhubung dengan banyak item_penjualan. item_penjualan memiliki id_item,id_penjualan, id_produk, jumlah, harga_jual. Jika
digambarkan seperti:
Many-to-many Banyak-ke-Banyak
Relasi many-to-many merupakan relasi yang paling kompleks, karena diperlukan tabel lain untuk menghubungkan dua tabel data yang saling berkepentingan. Seperti halnya penjualan bisa terhubung (berkepentingan) dengan banyak product, dan product bisa terhubungan dengan banyak penjualan. Tabel penjualan dan product memiliki relasi banyak ke banyak yang dihubungkan oleh tabel item_penjualan. Contoh lain adalah dosen bisa memiliki banyak mahasiswa dan mahasiswa bisa memiliki banyak dosen. Relasi banyak ke banyak antara dosen dan mahasiswa memerlukan tabel lain, sebut saja tabel mahasiswa_dosen. Jika digambarkan
seperti di bawah.
13. <dt>Penulis</dt> 14. <dd><input type="text" name="penulis"/></dd> 15. <dt>Penerbit</dt> 16. <dd><input type="text" name="penerbit"/></dd> 17. <dt>ISBN</dt> 18. <dd><input type="text" name="isbn"/></dd> 19. <dt>Tanggal Terbit</dt> 20. <dd><input type="text" name="tgl_terbit"/></dd> 21. <dt></dt> 22. <dd><input type="submit" value="Simpan"/></dd> 23. </dl> 24. </form>
Simpan kode di atas dengan nama form.php, kemudian buat file simpan.php untuk menyimpan data ke tabel product dan tabel buku, dengan kode di bawah. view plaincopy to clipboardprint TryIt? 1. <?php 2. if($_POST){ 3. $conn = mysql_connect("localhost","root",""); 4. mysql_select_db("test",$conn); 5. //menyimpan ke table product 6. $sql = "insert into product (nama,harga,jenis) values ('{$_POST['nama']}','{$_POST['h arga']}','{$_POST['jenis']}')"; 7. mysql_query($sql) or die('Gagal menyimpan produk'); 8. //mencari id produk 9. $sql = "select max(id_produk) as last_id from product limit 1"; 10. $hasil = mysql_query($sql); 11. $row = mysql_fetch_array($hasil); 12. $lastId = $row['last_id']; 13. //menyimpan data buku ke table buku 14. $sql = "insert into buku (id_produk,penulis,penerbit,isbn,tgl_terbit) 15. values ('$lastId','{$_POST['penulis']}','{$_POST['penerbit']}','{$_POST['isbn']}','{$_P OST['tgl_terbit']}')"; 16. mysql_query($sql) or die('Gagal menyimpan data buku'); 17. echo 'data tersimpan'; 18. }
Bisa dilihat kode di atas hampir sama dengan kode untuk menyimpan data ke satu tabel. Pada baris ke-2 dilakukan pengecekan apakah ada data yang dikirim atau tidak. Jika ada data yang dikirim, di baris ke-3 dan 4 dilakukan koneksi ke database. Kemudian pada baris ke-6 dan 7 menyimpan data ke tabel product. Selanjutnya dari ke ke-9 sampai 16 adalah untuk menyimpan data ke tabel buku. Setiap tabel yang berelasi, tabel anak (dalam kasus ini tabel buku) memiliki sebuah foreign key,
nilai foreign key ini diambil dari nilai referenced column -- primary key tabel induk (referenced table, tabel product dalam contoh ini). Pada contoh ini, kolom id_produk pada tabel buku adalah foreign key dan primary key tabel product (kolom id_produk) adalah referenced column. Nilai dari foreign key tidak boleh berisi nilai nilai yang tidak ada di reference colomn kecuali null. Sekarang lihat kembali baris ke-9. Baris ke-9 sampai 12 adalah untuk mencari id_produk yang baru saja disimpan pada tabel product (baris ke-6 dan 7). Kenapa proses ini diperlukan? Karena nilai dari kolom id_produk tabel buku tidak boleh berisi nilai nilai selain nilai yang ada di kolom id_produk tabel product. Selanjutnya baris ke-14 sampai 16 adalah untuk menyimpan data ke tabel buku, dan kolom id_produk diisi dengan nilai yang diperoleh dari baris sebelumnya (baris ke-9 sampai 12).
Pertama buatlah form html berikut: view plaincopy to clipboardprint TryIt? 1. <!-- file album.php --> 2. <form name="formalbum" action="simpan-album.php" method="post"> 3. Judul Album: <input type="text" name="judul"/> Nama Artis: <input type="text" name= "artis"/> 4. <table id="tabel-lagu" cellspacing="0" border="1" cellpadding="3"> 5. <tr> 6. <td>NO. Track</td> 7. <td>Judul</td> 8. <td>Durasi</td> 9. <td>Delete</td> 10. </tr> 11. <tr> 12. <td><input type="text" name="no_track[0]"/></td> 13. <td><input type="text" name="judul_lagu[0]"/></td> 14. <td><input type="text" name="durasi[0]"/></td> 15. <td><button type="button" class="del">Del</button></td> 16. </tr> 17. <tr id="last">
18.
<td colspan="4" align="right"><button type="button" id="addRow">Add</button> </td> 19. </tr> 20. </table> 21. <input type="submit" value="Simpan"/> 22. </form> 23. <script type="text/javascript" src=" https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jqu ery.min.js"></script> 24. <script type="text/javascript"> 25. var i = 1; 26. $(function(){ 27. $("#addRow").click(function(){ 28. row = '<tr>'+ 29. '<td><input type="text" name="no_track['+i+']"/></td>'+ 30. '<td><input type="text" name="judul_lagu['+i+']"/></td>'+ 31. '<td><input type="text" name="durasi['+i+']"/></td>'+ 32. '<td><button type="button" class="del">Del</button></td>'+ 33. '</tr>'; 34. $(row).insertBefore("#last"); 35. i++; 36. }); 37. }); 38. $(".del").live('click', function(){ 39. $(this).parent().parent().remove(); 40. }); 41. </script>
Yang perlu diperhatikan adalah atribut name dari element form (baris ke-12 sampai 14) yang diberi nilai seperti no_track[0], judul_lagu[0], durasi[0]. Penamaan seperti itu bertujuan agar data dikirim ke server berupa array. Selanjut buatlah file simpan-album.php untuk menyimpan data ke database. view plaincopy to clipboardprint TryIt? 1. 2. 3. 4. 5. <?php //file simpan-album.php if(!$_POST){ die('Tidak ada data yang disimpan!'); }
6. //koneksi ke database 7. $conn = mysql_connect("localhost","root","blah"); 8. mysql_select_db("test"); 9. //simpan ke tabel album 10. $sql = "insert into album (judul,artis) values ('{$_POST['judul']}','{$_POST['artis']}')"; 11. mysql_query($sql) or die('Gagal menyimpan album'); 12. //mencari id album 13. $sql = "select max(id) as id_album from album limit 1"; 14. $row = mysql_fetch_array(mysql_query($sql)); 15. $id_album = $row['id_album']; 16. //menyimpan data ke tabel lagu 17. foreach($_POST['judul_lagu'] as $key => $judul){ 18. $sql = "insert into lagu(id_album, no_track,judul,durasi) 19. values ('{$id_album}','{$_POST['no_track'][$key]}','{$judul}','{$_POST['durasi'][$ke y]}')"; 20. mysql_query($sql); 21. } 22. echo 'Data telah disimpan';
Baris ke-1 sampai 15 sama dengan cara yang dilakukan untuk menyimpan data ke tabel berelasi satu ke satu. Pertama membuka koneksi ke database (baris ke-7 dan 8). Kemudian menyimpan data ke tabel album (baris ke-10 dan 11). Selanjutnya mencari id album yang baru saja disimpan (baris ke-13 s/d 15). Langkah terakhir (baris ke-17 s/d 21) adalah melakukan perulangan dan menyimpan satu persatu data ke tabel lagu, serta id_album diisi dengan nilai yang diperoleh sebelumnya di baris ke-13 s/d 15.
Langkah Pertama: Menyimpan Data Mahasiswa. Untuk menyimpan data mahasiswa gunakan kode php di bawah. Kode di bawah sama seperti yang digunakan untuk menyimpan data ke satu tabel. view plaincopy to clipboardprint TryIt?
1. <?php 2. // file mahasiswa.php 3. if($_POST){ 4. $conn = mysql_connect("localhost","root","blah"); 5. mysql_select_db("test",$conn); 6. $sql = "insert into mahasiswa (nim,nama,jurusan) values ('{$_POST['nim']}','{$_POST ['nama']}','{$_POST['jurusan']}')"; 7. mysql_query($sql); 8. echo 'Data telah disimpan'; 9. } 10. ?> 11. <h3>Input Mahasiswa</h3> 12. <form name="form1" method="post" action=""> 13. <dl> 14. <dt>NIM</dt> 15. <dd><input type="text" name="nim"/></dd> 16. <dt>Nama</dt> 17. <dd><input type="text" name="nama"/></dd> 18. <dt>Jurusan</dt> 19. <dd><input type"text" name="jurusan"/></dd> 20. <dt></dt> 21. <dd><input type="submit" value="Simpan"/></dd> 22. </dl> 23. </form>
Simpan kode di atas dengan nama file mahasiswa.php Langkah Kedua: Menyimpan Data Mata Kuliah Menyimpan data mata kuliah sama seperti menyimpan data mahasiswa. Gunakan kode di bawah dan simpan dengan nama mata_kuliah.php. view plaincopy to clipboardprint TryIt? 1. <?php 2. //file mata_kuliah.php 3. if($_POST){ 4. $conn = mysql_connect("localhost","root","blah"); 5. mysql_select_db("test",$conn); 6. $sql = "insert into mata_kuliah (kode,nama) values ('{$_POST['kode']}','{$_POST['na ma']}')"; 7. mysql_query($sql); 8. echo 'Data telah disimpan'; 9. } 10. ?> 11. <h3>Input Mata Kuliah</h3> 12. <form name="form1" method="post" action=""> 13. <dl>
14. <dt>Kode MK</dt> 15. <dd><input type="text" name="kode"/></dd> 16. <dt>Nama</dt> 17. <dd><input type="text" name="nama"/></dd> 18. <dt></dt> 19. <dd><input type="submit" value="Simpan"/></dd> 20. </dl> 21. </form>
Langkah Ketiga: Menyimpan Data Mata Kuliah Seorang Mahasiswa Untuk mempermudah proses menyimpan data Mata Kuliah Seorang Mahasiswa, diperlukan kode untuk menampilkan daftar mahasiswa di bawah. view plaincopy to clipboardprint TryIt? 1. <?php 2. //file list-mahasiswa.php 3. $conn = mysql_connect("localhost","root","blah"); 4. mysql_select_db("test",$conn); 5. $sql = "select * from mahasiswa"; 6. $result = mysql_query($sql); 7. ?> 8. <table cellspacing="0" cellpadding="5" border="1"> 9. <tr> 10. <td>NIM</td> 11. <td>Nama</td> 12. <td>Jurusan</td> 13. <td>Aksi</td> 14. </tr> 15. <?php while($mhs = mysql_fetch_array($result)){?> 16. <tr> 17. <td><?php echo $mhs['nim'];?></td> 18. <td><?php echo $mhs['nama'];?></td> 19. <td><?php echo $mhs['jurusan'];?></td> 20. <td><a href="mahasiswa_mk.php?nim=<?php echo $mhs['nim'];?>">Tambah Mata Kuliah</a></td> 21. </tr> 22. <?php }?> 23. </table>
Simpan kode di atas dengan nama list-mahasiswa.php. Kode tersebut berfungsi untuk menampilkan daftar mahasiswa dan membuat link berjudul "Tambah Mata Kuliah" ke halaman mahasiswa_mk.php. Halaman mahasiswa_mk.php digunakan untuk menyimpan data mata kuliah seorang mahasiswa. view plaincopy to clipboardprint TryIt?
1. 2. 3. 4. 5. 6.
<?php //file mahasiswa_mk.php $conn = mysql_connect("localhost","root","blah"); mysql_select_db("test",$conn); //mencari data mahasiswa $sql = "select * from mahasiswa where nim='".mysql_real_escape_string($_GET['nim']). "'"; 7. $mhs = mysql_fetch_array(mysql_query($sql)); 8. ?> 9. <h2>Tambah Mata Kuliah Mahasiswa: <?php echo $mhs['nama'];?></h2> 10. <form name="form" method="post" action="simpan_mahasiswa_mk.php"> 11. <?php 12. //mencari semua data mata kuliah 13. $subquery = "select id_mk from mahasiswa_mk where nim='".$mhs['nim']."'"; 14. $sql = "select * from mata_kuliah where id not in ({$subquery})"; 15. $result = mysql_query($sql); 16. while($mataKuliah = mysql_fetch_array($result)){ 17. //membut checkbox 18. echo '<input type="checkbox" name="mata_kuliah[]" value="'.$mataKuliah['id'].'"/>'; 19. echo $mataKuliah['kode'].': '.$mataKuliah['nama'].' '; 20. } 21. ?> 22. <input type="hidden" name="nim" value="<?php echo $mhs['nim'];?>"/> 23. <br/> 24. <input type="submit" value="Simpan"/> 25. </form>
Baris ke-6 dan 7 kode di atas adalah untuk mencari data mahasiswa yang akan di tambahkan mata kuliahnya. Baris ke-8 menampilkan nama mahasiswa. Baris ke-13 dan 14 adalah membuat sql query untuk mencari mata kuliah yang belum ditambahkan ke mahasiswa bersangkutan. Untuk mempermudah di baris 13 dan 14 menggunakan subquery. Selanjutnya baris 15 s/d 20 untuk menampilkan checkbox mata kuliah yang belum dimiliki oleh mahasiswa bersangkutan. Langkah berikutnya adalah membuat file simpan_mahasiswa_mk.php untuk menyimpan data mata kuliah mahasiswa. view plaincopy to clipboardprint TryIt? 1. <?php 2. //file simpan_mahasiswa_mk.php 3. if($_POST){ 4. $conn = mysql_connect("localhost","root","blah"); 5. mysql_select_db("test",$conn); 6. foreach($_POST['mata_kuliah'] as $id_matakuliah){ 7. $sql = "insert into mahasiswa_mk (nim,id_mk) values ('{$_POST['nim']}','{$id_mat akuliah}')"; 8. mysql_query($sql) or die("Gagal Menyimpan Data".mysql_error());
Kode di atas hampir sama dengan cara menyimpan data ke tabel berelasi satu ke banyak.
__________________________________________________________________________
Data Buku
Kode BK100000001 BK100000002 BK100000003 BK100000004 Judul Microsoft Access 2007 Rumus - Rumus Matematika Chord Gitar 1001 Pribahasa Jenis Komputer Matematika Kesenian Matematika Pengarang herdiana Dhika Rian Bara Jumlah 2 2 1 3