16/06/12

    Bagi Anda dan saya yang sedang membuat sistem informasi akademik dan merasa kesulitan dengan bagaimana cara menampilkan nilai Index Prestasi (IP) mahasiswa untuk setiap semesternya, mudah-mudahan artikel ini berguna.
Ide menulis artikel ini muncul sewaktu perjalanan menuju my campus :-)
OK… dalam artikel ini akan saya coba kupas bagaimana membuat query SQL untuk menampilkan Index Prestasi mahasiswa untuk setiap semester yang telah ditempuhnya. Query ini pasti terdapat dalam sebuah sistem informasi akademik untuk menginformasikan track record akademik seorang mahasiswa yang telah menempuh perkuliahan.
Misalkan kita memiliki tabel matakuliah (‘mk’) dan pengambilan matakuliah (‘ambilmk’) dalam database sebagai berikut:

1.CREATE TABLE mk (
2.kodeMK varchar(5),
3.namaMK varchar(20),
4.sks int(11),
5.PRIMARY KEY(kodeMK)
6.)
1.CREATE TABLE ambilmk (
2.nim varchar(5),
3.kodeMK varchar(5),
4.nilai float,
5.smt varchar(10),
6.tahun varchar(9),
7.PRIMARY KEY  (nim, kodeMK, smt, tahun),
8.)

disertai dengan record untuk masing-masing tabel sbb:

1.INSERT INTO `ambilmk` VALUES ('M002', 'MK01', '3', 'GANJIL', '2008/2009');
2.INSERT INTO `ambilmk` VALUES ('M002', 'MK02', '4', 'GANJIL', '2008/2009');
3.INSERT INTO `ambilmk` VALUES ('M002', 'MK03', '3', 'GENAP', '2008/2009');
4.INSERT INTO `ambilmk` VALUES ('M002', 'MK04', '4', 'GENAP', '2008/2009');
5.INSERT INTO `ambilmk` VALUES ('M002', 'MK05', '4', 'GANJIL', '2009/2010');

1.INSERT INTO `mk` VALUES ('MK01', 'DATABASE', '3');
2.INSERT INTO `mk` VALUES ('MK02', 'PEMROGRAMAN DASAR', '2');
3.INSERT INTO `mk` VALUES ('MK03', 'PEMROGRAMAN WEB', '4');
4.INSERT INTO `mk` VALUES ('MK04', 'OOP', '3');
5.INSERT INTO `mk` VALUES ('MK05', 'PEMROGRAMAN VISUAL', '3');

Keterangan:

  Di dalam tabel ‘ambilmk’ terdapat field ‘smt’ yang digunakan untuk memberi keterangan pada semester apa (genap/ganjil) si mahasiswa mengambil matakuliah tersebut. Sedangkan field ‘tahun’ menunjukkan tahun ajarannya.
   OK… sekarang bagaimana dengan bentuk query SQL nya. Untuk mencari IP, tentu kita harus tahu dulu formulanya, yaitu
IP = sum(sks x nilai)/sum(sks)
atau hasil dari penjumlahan sks x nilai matakuliah yang telah diambil dibagi dengan jumlah sks matakuliah tersebut.
Nah… sekarang kita terapkan formula tersebut ke dalam query SQL. Dalam hal ini kita akan menampilkan hasil querynya dalam bentuk SMT, TAHUN, IP.
   But… tunggu dulu. Field ‘nilai’ ada di tabel ‘ambilmk’ sedangkan field ‘sks’ ada di tabel ‘mk’. So… gimana donk? …. Lho apanya yang gimana? kan kita bisa relasikan kedua tabel melalui field ‘kodemk’. So… no problem kan? :-)

1.SELECT smt, tahun, sum(sks * nilai)/sum(sks) as IP
2.FROM ambilmk, mk
3.WHERE ambilmk.kodemk = mk.kodemk AND nim = 'M002'
4.GROUP BY tahun, smt
Query SQL di atas akan mencoba menampilkan IP mahasiswa bernim ‘M002 untuk setiap semester dan tahun ajarannya.
Mungkin Anda bertanya, mengapa dalam query SQL perlu diberikan GROUP BY tahun, smt? Ya… karena query ini tujuannya adalah menampilkan IP setiap tahun dan semesternya. Sehingga perhitungan nilai untuk menghasilkan IP juga harus perlu dikelompokkan berdasarkan tahun dan semesternya.
Hasil query di atas akan menghasilkan output seperti di bawah ini
Photobucket
Trus.. mungkin Anda bertanya lagi, apakah perintah ‘GROUP BY tahun, smt’ nya harus seperti itu? Maksudnya, bisakah dibalik menjadi ‘GROUP BY smt, tahun’? Jawabannya adalah ‘NO PROBLEM’. Hasilnya tetap sama, namun yang berbeda adalah tampilannya saja. Bila Anda menggunakan ‘GROUP BY smt, tahun’ maka pengelompokan diprioritaskan pada semester, sehingga dalam tampilannya menjadi seperti di bawah ini
Photobucket
Anda lihat bahwa pada hasil di atas, jika digunakan ‘GROUP BY smt, tahun‘ maka nama semester yang sama akan mengumpul menjadi satu (dalam baris yang berurutan).
Sekarang Anda coba bandingkan dengan gambar pertama yang merupakan hasil dari penggunaan ‘GROUP BY tahun, smt‘. Dalam gambar tersebut tampak bahwa tahun yang sama akan mengumpul menjadi satu (dalam baris yang berurutan). Nah.. tentunya tampilan yang lebih baik adalah tampilan pada gambar pertama di atas yang menggunakan ‘GROUP BY tahun, smt‘.
    OK.. mudah-mudahan sedikit artikel ini berguna buat Anda yang sedang belajar SQL maupun yang sedang membuat sistem informasi akademik.
Sebuah sistem informasi akademik seharusnya merekam atau mencatat semua track record akademik mahasiswanya secara lengkap detail dan lengkap. Proses pencatatan ini harus dilakukan secara kontinyu tiap semester.
    Sistem informasi akademik tidak lepas dengan pencatatan nilai semua mahasiswanya. Dalam pencatatan nilai ini, terkadang ada banyak mahasiswa yang mengambil sebuah matakuliah lebih dari sekali. Yah… itu wajar mengingat tidak semua matakuliah itu mudah, sehingga butuh beberapa kali pengambilan matakuliah yang sama sampai mencapai nilai yang baik.
     Sebagai contoh misalkan ada mahasiswa A dia mengambil matakuliah X pada semester 1. Karena si A ini anaknya malas belajar, maka nilai matakuliah X nya jelek sekali yaitu 1.0 (D). Nah… semester 3, si A ini kembali lagi mengambil matakuliah X. Namun dengan usahanya kali ini dia hanya mendapatkan nilai 2.0 (C). Karena matakuliah itu sebenarnya menyenangkan, maka si A ingin mengambil lagi matakuliah X di semester 5. Nah.. karena usahanya dalam belajar tinggi, maka akhirnya ia mendapat nilai 4.0 (A).
Nah… dalam sistem informasi akademik harus dapat mencatat semua track record mahasiswa A di atas dalam pengambilan matakuliah X nya, mulai dari semester 1, 3, dan 5.
Selanjutnya ketika si A akan lulus kuliah, maka sistem informasi akademik akan mencetak semua hasil studinya (transkrip nilai). Untuk kasus di atas (pengambilan matakuliah X), harusnya sistem informasi akademik hanya akan menampilkan hasil yang terbaik, yaitu nilai 4.0 (A) pada matakuliah X nya.
Yang menjadi pertanyaan adalah, ‘Bagaimana membuat query SQL untuk menampilkan daftar matakuliah yang telah diikuti mahasiswa beserta hasilnya, dengan ketentuan jika ada sebuah matakuliah yang diikuti beberapa kali maka hanya akan ditampilkan sekali yaitu yang memiliki nilai terbaik saja”. Pertanyaan inilah yang akan dibahas pada artikel kali ini.
OK.. untuk membahasnya, ada baiknya kita sajikan terlebih dahulu data-datanya. Dalam kasus ini misalkan terdapat 3 buah tabel yaitu ‘mhs’, ‘mk’ dan ‘ambilmk’. Tabel ‘mhs’ digunakan untuk menyimpan data mahasiswa, ‘mk’ untuk menyimpan data matakuliah-matakuliah, dan ‘ambilmk’ untuk menyimpan data pengambilan matakuliah oleh mahasiswa beserta nilainya.

1.CREATE TABLE mhs (
2.nim varchar(10),
3.namamhs varchar(30),
4.alamat text,
5.sex varchar(10),
6.PRIMARY KEY  (nim)
7.);

1.INSERT INTO mhs VALUES ('M0197001', 'ROSIHAN ARI YUANA', 'COLOMADU', 'L');
2.INSERT INTO mhs VALUES ('M0197002', 'DWI AMALIA FITRIANI', 'KUDUS', 'P');
3.INSERT INTO mhs VALUES ('M0197003', 'FAZA FAUZAN KH.', 'COLOMADU', 'L');
4.INSERT INTO mhs VALUES ('M0197004', 'NADA HASANAH', 'COLOMADU', 'P');
5.INSERT INTO mhs VALUES ('M0197005', 'MUH. AHSANI TAQWIM', 'COLOMADU', 'L');

1.CREATE TABLE mk (
2.kodemk varchar(5),
3.namamk varchar(20),
4.sks int(11),
5.smt int(11),
6.PRIMARY KEY  (kodemk)
7.) ;
1.INSERT INTO mk VALUES ('K001', 'KALKULUS I', 3, 1);
2.INSERT INTO mk VALUES ('K002', 'KALKULUS II', 3, 2);
3.INSERT INTO mk VALUES ('K003', 'GEOMETRI', 2, 1);
4.INSERT INTO mk VALUES ('K004', 'NUMERIK', 3, 2);

1.CREATE TABLE ambilmk (
2.nim varchar(10),
3.kodemk varchar(5),
4.smt varchar(6),
5.thajaran varchar(9),
6.nilai float,
7.PRIMARY KEY (nim, kodemk, smt, thajaran)
8.);

1.INSERT INTO ambilmk VALUES ('M0197001', 'K001', 'GANJIL', '2007/2008', 1);
2.INSERT INTO ambilmk VALUES ('M0197001', 'K002', 'GANJIL', '2007/2008', 2);
3.INSERT INTO ambilmk VALUES ('M0197001', 'K003', 'GANJIL', '2007/2008', 3);
4.INSERT INTO ambilmk VALUES ('M0197002', 'K001', 'GANJIL', '2007/2008', 2);
5.INSERT INTO ambilmk VALUES ('M0197002', 'K002', 'GANJIL', '2007/2008', 3);
6.INSERT INTO ambilmk VALUES ('M0197001', 'K001', 'GANJIL', '2008/2009', 2);
7.INSERT INTO ambilmk VALUES ('M0197001', 'K001', 'GANJIL', '2009/2010', 4);
Dari data pengambilan matakuliah di atas tampak bahwa mahasiswa bernim ‘M0197001 mengambil matakuliah berkode ‘K001 beberapa kali, tepatnya 3 kali. Pengambilan pertama dia mendapat 1.0, kedua 2.0 dan ketiga mendapat 4.0.
Sekarang bagaimana cara menulis query SQL untuk menampilkan semua matakuliah yang telah diikuti mahasiswa bernim ‘M0197001 ini?
OK… misalkan kita gunakan query seperti berikut ini

1.SELECT nim, kodemk, nilai
2.FROM ambilmk
3.WHERE nim = 'M0197001';

Hasil query di atas adalah
Photobucket
Jika Anda gunakan query di atas maka akan tampak semua matakuliah yang telah diikuti mahasiswa tersebut. Dalam hasil yang diperoleh akan tampak bahwa matakuliah ‘K001 muncul sebanyak 3 kali dengan nilainya masing-masing. Sehingga penggunaan query di atas belum menampilkan hasil pengambilan matakuliah ‘K001 secara tunggal dengan nilai tertinggi.
Hmm… yang nilainya tertinggi yah… OK.. berarti kita harus gunakan function MAX(nilai). Tapi eit… tunggu dulu! Nilai tertinggi di sini bukan nilai nilai tertinggi secara umum dari semua matakuliah yang diambil tapi nilai tertinggi dari matakuliah yang sama yang pernah diambilnya. Oleh karena itu dalam query SQL yang kita buat ini nanti harus ada ‘GROUP BY kodemk’

1.SELECT nim, kodemk, max(nilai)
2.FROM ambilmk
3.WHERE nim = 'M0197001'
4.GROUP BY kodemk;

Hasil query di atas adalah
Photobucket
Yes…. sudah lebih baik sekarang. Dari hasil di atas tampak bahwa untuk nilai ‘K001 sudah muncul hanya sebuah dengan nilai yang tertinggi.
OK.. next… bagaimana jika kita ingin menampilkan nama masing-masing matakuliahnya dan juga SKS nya? Hmm.. ya berarti kita harus relasikan tabel ‘ambilmk’ dengan ‘mk’.


1.SELECT ambilmk.nim, ambilmk.kodemk, mk.namamk, mk.sks, MAX(ambilmk.nilai)
2.FROM ambilmk, mk
3.WHERE ambilmk.kodemk = mk.kodemk AND ambilmk.nim = 'M0197001'
4.GROUP BY ambilmk.kodemk;

Hasil query di atas adalah
Photobucket
He..3x mudah bukan membuat query SQL nya. Nah… mudah-mudahan artikel ini bisa membantu Anda yang sedang membuat sistem informasi akademik.


 BACA JUGA YANG INI DEH.....

    Pada artikel ini akan diberikan beberapa contoh perintah SQL yang diimplementasikan pada multi tabel. Adapun perintah SQL untuk manipulasi data pada satu tabel, saya yakin hal ini cukup mudah bagi Anda. Dalam contoh ini akan diambil studi kasus tentang pengambilan matakuliah mahasiswa.
Tabel-tabel yang dibuat pada studi kasus ini cukup sederhana saja untuk memudahkan pemahaman. Adapun tabel-tabel tersebut adalah:

1.mhs (
2.nim varchar(3),
3.namaMhs varchar(30),
4.primary key(nim)
5.)
1.mk (
2.kodeMK varchar(3),
3.namaMK varchar(30),
4.sks integer,
5.primary key(kodeMK)
6.)
1.ambilMK (
2.nim varchar(3),
3.kodeMK varchar(3),
4.nilai integer,
5.primary key(nim, kodeMK)
6.)

   Dalam hal ini, field nim dan kodeMK pada tabel ambilMK merupakan foreign key. Apabila diperhatikan, tabel mhs dengan tabel ambilMK saling berelasi karena nim dalam tabel ambilMK berasal dari nim dalam tabel mhs (master tabel).
Demikian pula antara tabel mk dengan ambilMK. Kedua tabel ini juga berelasi karena kodeMK dalam tabel ambilMK berasal dari kodeMK dalam tabel mk.
Untuk record masing-masing tabel, misalkan diberikan berikut ini:
Tabel : mhs

1.nim Â Ã‚  namaMhs
2.001 Â Ã‚  Joko
3.002 Â Ã‚  Amir
4.003 Â Ã‚  Budi
Tabel : mk

1.kodeMK Â Ã‚  namaMK Â Ã‚   Â Ã‚  sks
2.A01 Â Ã‚     Kalkulus Â Ã‚    3
3.A02 Â Ã‚     Geometri Â Ã‚    2
4.A03 Â Ã‚     Aljabar Â Ã‚   Â Ã‚ 3
Tabel : ambilMK

1.nim Â Ã‚  kodeMK Â Ã‚  nilai
2.001 Â Ã‚  A01 Â Ã‚       3
3.001 Â Ã‚  A02 Â Ã‚       4
4.001 Â Ã‚  A03 Â Ã‚       2
5.002 Â Ã‚  A02 Â Ã‚       3
6.002 Â Ã‚  A03 Â Ã‚       2
7.003 Â Ã‚  A01 Â Ã‚       4
8.003 Â Ã‚  A03 Â Ã‚       3

Selanjutnya misalkan akan dicari data-data sbb:
  1. Tampilkan nim dan nama mahasiswa yang mengambil Kalkulus (kodeMK = A01)
  2. Tampilkan nim, nama mahasiswa dan jumlah SKS matakuliah yang diambil untuk setiap mahasiswa
  3. Berapakah IPK mahasiswa bernama Budi (NIM: 003)
  4. Tampilkan nim, nama mahasiswa, dan IPK setiap mahasiswa
     Untuk menjawab no. 1, kita harus cari dulu tabel mana yang terkait dengan query tersebut. Apabila kita akan mencari query tersebut berdasarkan nama matakuliah ‘Kalkulus’ maka tabel yang terkait adalah mhs (untuk menampilkan nim dan nama mahasiswa), mk (karena dalam tabel ini terdapat nama matakuliah), serta tabel ambilMK (karena tabel ini berisi data pengambilan matakuliah oleh mahasiswa).
Setelah menentukan tabel mana yang terkait dengan query, selanjutnya dapat dibuat statement SQL nya, yaitu

1.SELECT mhs.nim, mhs.namaMhs
2.FROM mhs, mk, ambilMK
3.WHERE mhs.nim = ambilMK.nim AND mk.kodeMK = ambilMK.kodeMK
4.AND mk.namaMK = 'Kalkulus';
Maksud mhs.nim, maksudnya adalah menampilkan data nim yang berasal dari tabel mhs. Dapat pula Anda menuliskan SQL nya seperti ini

1.SELECT ambilMK.nim, mhs.namaMhs
2.FROM mhs, mk, ambilMK
3.WHERE mhs.nim = ambilMK.nim AND mk.kodeMK = ambilMK.kodeMK
4.AND mk.namaMK = 'Kalkulus';

    Hal ini dikarenakan untuk menampilkan nim dapat pula berasal dari tabel ambilMK.
Perhatikan bagian FROM dari kedua statement SQL di atas. Nama-nama tabel yang terkait dengan query dituliskan pada bagian FROM ini.
Selanjutnya apa maksud dari perintah mhs.nim = ambilMK.nim? Perintah ini digunakan untuk merelasikan tabel mhs dan ambilMK, dimana kedua tabel direlasikan melalui field nim di kedua tabel. Hal yang sama juga berlaku untuk perintah mk.kodeMK = ambilMK.kodeMK.
Sedangkan perintah mk.namaMK = ‘Kalkulus’ digunakan sebagai syarat pencarian data (menampilkan data mahasiswa yang mengambil matakuliah Kalkulus).
    Apabila pencarian data mahasiswa yang mengambil Kalkulus ini berdasarkan kode matakuliah (A01), maka Anda tidak perlu menggunakan tabel mk, tapi cukup tabel mhs dan ambilMK saja. Hal ini dikarenakan kodeMK dapat diketahui dari tabel ambilMK. Sehingga perintah SQL nya

1.SELECT mhs.nim, mhs.namaMhs
2.FROM mhs, ambilMK
3.WHERE mhs.nim = ambilMK.nim AND ambilMK.kodeMK = 'A01';
Ketiga statement SQL di atas akan menghasilkan hasil yang sama yaitu
1.NIM Â Ã‚  namaMhs
2.001 Â Ã‚  Joko
3.003 Â Ã‚  Budi

  Selanjutnya akan dijawab pertanyaan no. 2. Seperti halnya langkah penyelesaian pertanyaan no. 1, langkah pertama harus kita tentukan dulu tabel apa saja yang terkait dengan query. Dalam hal ini kita akan menggunakan tabel mhs, mk dan ambilMK. Tabel mhs untuk menampilkan nim dan nama mahasiswa. Tabel mk digunakan karena di dalamnya terdapat data SKS. Sedangkan tabel ambilMK digunakan karena berisi data yang menunjukkan pengambilan matakuliah mahasiswa.
Perintah SQL untuk pertanyaan no. 2 adalah

1.SELECT mhs.nim, mhs.namaMhs, sum(mk.sks) as jumlahSKS
2.FROM mhs, mk, ambilMK
3.WHERE mhs.nim = ambilMK.nim AND mk.kodeMK = ambilMK.kodeMK
4.GROUP BY ambilMK.nim
atau

1.SELECT mhs.nim, mhs.namaMhs, sum(mk.sks) as jumlahSKS
2.FROM mhs, mk, ambilMK
3.WHERE mhs.nim = ambilMK.nim AND mk.kodeMK = ambilMK.kodeMK
4.GROUP BY mhs.nim

Untuk mencari jumlah SKS setiap mahasiswa, kita menggunakan perintah sum(mk.sks). Supaya perintah ini bisa jalan, maka harus ditambahkan perintah GROUP BY mhs.nim atau GROUP BY ambilMK.nim. Hal ini dikarenakan proses penjumlahan sks harus dilakukan pada setiap kelompok data. Maksudnya apa ya?
Perhatikan perintah SQL berikut ini

1.SELECT mhs.nim, mhs.namaMhs, mk.sks
2.FROM mhs, mk, ambilMK
3.WHERE mhs.nim = ambilMK.nim AND mk.kodeMK = ambilMK.kodeMK

Perintah di atas akan menampilkan nim, nama mahasiswa serta sks setiap mata kuliah yang diambil. Hasilnya adalah

1.NIM Â Ã‚  namaMhs Â Ã‚   Â Ã‚  SKS
2.001 Â Ã‚  Joko Â Ã‚   Â Ã‚         3
3.001 Â Ã‚  Joko Â Ã‚   Â Ã‚         2
4.001 Â Ã‚  Joko Â Ã‚   Â Ã‚         3
5.002 Â Ã‚  Amir Â Ã‚   Â Ã‚         2
6.002 Â Ã‚  Amir Â Ã‚   Â Ã‚         3
7.003 Â Ã‚  Budi Â Ã‚   Â Ã‚         3
8.003 Â Ã‚  Budi Â Ã‚   Â Ã‚         3

Untuk pertanyaan no. 2 ini, seharusnya akan tampil hasil berikut
1.NIM Â Ã‚  namaMhs Â Ã‚   Â Ã‚  jumlahSKS
2.001 Â Ã‚  Joko Â Ã‚   Â Ã‚        8
3.002 Â Ã‚  Amir Â Ã‚   Â Ã‚        5
4.003 Â Ã‚  Budi Â Ã‚   Â Ã‚        6

  Sehingga supaya mendapatkan hasil seperti di atas, kita akan menjumlahkan setiap SKS yang diambil mahasiswa, berdasarkan kelompok mahasiswa, dalam hal ini dikelompokkan berdasarkan NIM. Mengapa tidak dikelompokkan berdasarkan nama mahasiswa? Wah bisa gawat kalau ini terjadi, karena ada kemungkinan  nama mahasiswa yang sama. Oleh karena itu harus ada perintah GROUP BY mhs.nim


   Bagaimana perintah SQL untuk menampilkan IPK dari mahasiswa berNIM ’003?
Untuk membuat SQL dari query di atas, lagi-lagi langkah pertama adalah menentukan di tabel mana kita akan bekerja. Apabila Anda perhatikan, maka tabel yang dipilih adalah mk dan ambilMK. Mengapa demikian? Tabel mk digunakan untuk mengambil informasi terkait dengan sks matakuliah yang diambil mahasiswa dan tabel ambilMK berisi informasi daftar matakuliah yang diambil mahasiswa.
Nah… , setelah Anda menentukan tabel yang digunakan, selanjutnya Anda harus tahu formula untuk menghitung IPK. Apa rumusnya? yaitu jumlah dari perkalian sks dan nilai yang diambil mahasiswa dibagi dengan jumlah sks yang diambil mahasiswa.
OK begitu Anda tahu rumusnya, langsung dapat diimplementasikan ke SQL, yaitu

1.SELECT sum(ambilMK.nilai * mk.sks)/sum(mk.sks) as IPK
2.FROM ambilMK, mk
3.WHERE ambilMK.kodeMK = mk.kodeMK
4.AND ambilMK.nim = '003';

  Dari SQL di atas, Anda akan memperoleh hasil IPK mhs bernim ’003 adalah 3.5
Hikmah dari contoh kasus pencarian IPK ini adalah, apabila Anda membuat sistem untuk pencatatan nilai siswa seperti sistem informasi akademik dan sejenisnya, sebaiknya data IP atau IPK jangan disimpan dalam tabel, melainkan melalui proses query. Apabila data IP atau IPK tersimpan ke dalam tabel, maka kemungkinan terjadi ketidakkonsistenan data semakin besar. Bisa jadi IP atau IPK yang tersimpan di table
berbeda dengan kenyataan berdasarkan nilai-nilai matakuliah yang diperoleh siswa. Lagipula jika data-data IP dan IPK disimpan dalam tabel, maka hanya akan menambah penuh database Anda :-)
    OK… selanjutnya akan kita bahas untuk pertanyaan no. 4, yaitu bagaimana statement SQL untuk menampilkan nim, nama dan nilai IPK semua mahasiswa.
Nah… kalau pertanyaan ini, kita harus menggunakan semua tabel, yaitu mhs, mk dan ambilMK.Tabel mhs diperlukan karena untuk menampilkan nama mahasiswa, bisa juga untuk nim. Tapi nim juga dapat ditampilkan melalui tabel ambilMK.
Bagaimana statement SQL nya?

1.SELECT mhs.nim, mhs.namaMhs, 
2.sum(ambilMK.nilai * mk.sks)/sum(mk.sks) as IPK
3.FROM mhs, ambilMK, mk
4.WHERE mhs.nim = ambilMK.nim AND ambilMK.kodeMK = mk.kodeMK
5.GROUP BY mhs.nim

Mengapa harus ada perintah GROUP BY mhs.nim? Hal ini karena perhitungan IPK dapat dilakukan setelah data dikelompokkan berdasarkan nim, mengingat seorang mahasiswa dapat mengambil matakuliah lebih lebih dari satu.

 BACA JUGA ARTIKEL INI...

Ada beberapa mahasiswa saya yang bertanya,bisa tidak di MySQL diterapkan konsep Foreign Key dan Referential Integrity seperti halnya di MS. Access?”. Memang dalam MS. Access kita bisa melakukan setting relasi antar tabel, yang menggambarkan hubungan PRIMARY KEY dan FOREIGN KEY antar tabel.
Sebagai contoh, misalkan dalam kasus pengambilan matakuliah mahasiswa. Dalam kasus ini misalkan terdapat tabel induk bernama ‘MHS’ yang di dalamnya terdapat field NIM, NAMAMHS. Tabel induk yang lain adalah ‘MK’ untuk menyimpan data matakuliah dengan field-fieldnya KODEMK, NAMAMK. Dalam hal ini field NIM dan KODEMK masing-masing adalah primary key pada tabel ‘MHS’ dan ‘MK’. Selanjutnya ada tabel lain bernama ‘AMBILMK’ dengan field NIM, KODEMK, NILAI yang digunakan untuk menyimpan data pengambilan matakuliah mahasiswa. Nah… dalam hal ini, field NIM dan KODEMK keduanya adalah bertindak sebagai FOREIGN KEY.
   Selanjutnya dalam MS. Access terdapat pula fasilitas untuk mengimplementasikan referensial integrity. Misalkan, kita ubah data salah satu kode NIM mahasiswa dalam tabel induk ‘MHS’. Nah… secara otomatis proses update ini juga terjadi di tabel ‘AMBILMK’ yaitu pada data yang terkait NIM tersebut. Begitu pula pada proses penghapusan. Sebagai contoh misalkan kita hapus salah satu kode matakuliah di tabel MK, maka secara otomatis data yang terkait dengan kode matakuliah tersebut pada tabel ‘AMBILMK’ akan terhapus.
   Nah.. bagaimana dengan MySQL? Kira-kira bisa tidak diterapkan kedua hal di atas seperti halnya MS. Access? Saya jawab TENTU SAJA BISA.
Yang menjadi pertanyaan adalah, “Bagaimana cara melakukannya?”.
Ya… untuk menerapkan konsep FOREIGN KEY dan REFERENTIAL INTEGRITY ini, kita harus mensetting MySQL nya bisa support untuk tabel bertipe INNODB. Biasanya ketika proses instalasi MySQL akan ditanyakan apakah databasenya support dengan INNODB? Untuk hal ini, Anda harus jawab YA. Namun.. bila proses instalasi Anda terlanjur tidak memilih support INNODB, maka cara mengaktifkan INNODB adalah buka file “my.ini” lalu cari baris perintah “skip-innodb”. Hapuslah perintah ini, lalu hentikan MySQL dan hidupkan kembali MySQL (restart MySQL).
   OK… sekarang kita coba untuk studi kasus. Kita akan membuat database untuk keperluan pengambilan matakuliah mahasiswa seperti pada kasus di atas. Berikut ini, adalah perintah SQL untuk membuat tabel-tabelnya.
Perintah SQL untuk membuat tabel ‘MHS’

1.CREATE TABLE mhs
2.(
3.nim  varchar(8),
4.namaMhs varchar(20),
5.PRIMARY KEY (nim)
6.) TYPE = INNODB;
Perintah SQL untuk membuat tabel ‘MK’

1.CREATE TABLE mk
2.(
3.kodeMK  varchar(3),
4.namaMK varchar(20),
5.PRIMARY KEY (kodeMK)
6.) TYPE = INNODB;
Perhatikan kedua perintah SQL di atas. Karena kita akan membuat tabel bertipe INNODB, maka masing-masing perintah SQL diberikan perintah TYPE = INNODB;
Sekarang, kita lanjutkan untuk membuat tabel untuk ‘ambilMK’.

01.CREATE TABLE ambilMK
02.(
03.nim  varchar(8),
04.kodeMK varchar(3),
05.nilai float(3,2),
06.PRIMARY KEY (nim, kodeMK),
07.FOREIGN KEY (nim) REFERENCES mhs (nim) ON DELETE CASCADE ON UPDATECASCADE,
08.FOREIGN KEY (kodeMK) REFERENCES mk (kodeMK) ON DELETE CASCADE ON UPDATECASCADE
09.) TYPE = INNODB;

Tabel di atas terdapat dua primary key yaitu NIM dan KODEMK. Sedangkan field NIM ini juga merupakan foreign key yang direferensikan dari field NIM yang ada dalam tabel MHS. Oleh karena itu tambahkan perintah “FOREIGN KEY (nim) REFERENCES mhs (nim)”. Selanjutnya apa maksud dari “ON DELETE CASCADE”? Perintah ini maksudnya bila ada data NIM yang dihapus pada tabel MHS, maka secara otomatis data NIM yang ada dalam tabel AMBILMK ini juga akan terhapus. Sedangkan “ON UPDATE CASCADE” digunakan untuk proses update otomatis pada NIM dalam tabel AMBILMK, apabila NIM yang ada di tabel MHS ini diupdate.
Hal yang sama juga kita terapkan untuk tabel AMBILMK. Dalam hal ini, KODEMK adalah sebagai foreign key yang direfensikan dari KODEMK yang ada dalam tabel MK.
Sekarang coba Anda masukkan data-data berikut ini pada tabel MHS

1.NIM       NAMAMHS
2.M0197001  Rosihan Ari Yuana
3.M0197002  Dwi Amalia Fitriani
4.M0197003  Faza Fauzan
5.M0197004  Nada Hasanah
6.M0197005  Muh. Ahsani Taqwim
Masukkan pula data pada tabel MK

1.KODEMK    NAMAMK
2.M01       Database
3.M02       OOP
Nah… untuk mengecek referensial integrity, sekarang kita coba masukkan data pada tabel AMBILMK.

1.INSERT INTO ambilmk VALUES ('M0197001', 'M01', 3.0);
Ketika perintah SQL di atas dijalankan, data dapat dimasukkan ke tabel AMBILMK dengan sukses. Kita lihat bahwa NIM M0197001 terdapat dalam tabel MHS, begitu pula pada kode matakuliah M01 yang ada pada tabel MK.
Sehingga isi tabel AMBILMK menjadi

1.NIM       KODEMK    NILAI
2.M0197001  M01       3.0
Sekarang kita coba masukkan data berikut ini

1.INSERT INTO ambilmk VALUES ('M0197006', 'M01', 3.0);
Nah… perintah di atas akan menghasilkan error. Hal ini disebabkan NIM M0197006 tidak ada dalam tabel MHS.
Sekarang kita coba melakukan proses update. Kita akan mengupdate NIM M0197001 menjadi M0197010 yang ada dalam tabel MHS.
1.UPDATE mhs SET nim = 'M0197010' WHERE nim = 'M0197001';
Hasil query di atas pada tabel MHS menjadi

1.NIM       NAMAMHS
2.M0197010  Rosihan Ari Yuana
3.M0197002  Dwi Amalia Fitriani
4.M0197003  Faza Fauzan
5.M0197004  Nada Hasanah
6.M0197005  Muh. Ahsani Taqwim
Sekarang Anda coba lihat isi tabel AMBILMK. Pastilah isinya menjadi berikut ini

1.NIM       KODEMK    NILAI
2.M0197010  M01       3.0
Selanjutnya kita coba update untuk KODEMK yang ada dalam tabel MK. Misalnya akan diubah kode mk M01 menjadi M09.
1.UPDATE mk SET kodeMK = 'M09' WHERE kodeMK = 'M01';
Hasil query di atas pada tabel MK adalah

1.KODEMK    NAMAMK
2.M09       Database
3.M02       OOP
Nah… bila kita lihat data di tabel AMBILMK, pastilah isinya menjadi

1.NIM       KODEMK    NILAI
2.M0197010  M09       3.0
1.NIM       KODEMK    NILAI
2.M0197010  M09       3.0
Bagaimana dengan proses penghapusan? Kita cek aja… sekarang kita coba hapus data mahasiswa berNIM M0197010 dalam tabel MHS.

1.DELETE FROM mhs WHERE nim = 'M0197010';
Hasil dari query SQL di atas pada tabel MHS adalah

1.NIM       NAMAMHS
2.M0197002  Dwi Amalia Fitriani
3.M0197003  Faza Fauzan
4.M0197004  Nada Hasanah
5.M0197005  Muh. Ahsani Taqwim

Sekarang bila kita lihat isi tabel AMBILMK, pastilah menjadi kosong karena data pengambilan matakuliah terkait dengan mahasiswa NIM M0197010 ini ikut terhapus.
OK… begitulah penjelasan ini saya tulis. Moga-moga bermanfaat bagi  kita semua deh... semua… terus semangat belajar dan pantang menyerah. Indonesia sangat membutuhkan kita ..Salam Hangat....WILLH NOBIS




Read more ...