Wah cukup lama juga nih dah nggak ngisi blog, abis akhir2 ini lagi sibuk banget nih, haha9 …so sibuk deh lebih tepatnya ☺. Oh ya kali ini saya akan mencoba bagi‐bagi ilmu sedikit mengenai database, soal ini saya dapat ketika sedang mengikuti kuliah Basis Data beberapa hari lalu. Soalnya adalah sebagai berikut : Diketahui Skema database fakultas yang terdiri dari 3 tabel : ‐ MAHASISWA (NO_MHS, NAMA_MAHASISWA, PROGRAM_STUDI, KOTA_ASAL) ‐ MATAKULIAH (NO_MK, NAMA_MK, PROGRAM_STUDI) ‐ NILAI (NO_MHS, NO_MK, NILAI) Buatlah Table, beserta jawablah soal‐soal yang ada: Jawab :
Saya akan menjawab soal berikut dengan dua database yang berbeda yaitu MySQL Versi 5.0 dan Oracle 10g, Hal ini karena ada sedikit perbedaan antara sintaks SQL kedua Database tersebut, biasanya terkait dengan tipe datanya. Seperti di Oracle ada tipe data Number, tetapi di MySQL tidak ada, di Oracle ada Tipe data VARCHAR2(), tetapi di MySQL hanya ada VARCHAR() saja, tidak ada tipe VARCHAR2() di MySQL, setidaknya pada saat saya mengetik tutorial ini ☺ Oke berikut adalah sintaks untuk Oracle 10g Database : Untuk Table Mahasiswa CREATE TABLE MAHASISWA ( NO_MHS CHAR(10), NAMA_MAHASISWA VARCHAR2(30), PROGRAM_STUDI VARCHAR2(30), KOTA_ASAL VARCHAR2(30) ); ALTER TABLE MAHASISWA ADD ( CONSTRAINT PK_MAHASISWA PRIMARY KEY (NO_MHS) ); Untuk Table Matakuliah CREATE TABLE MATAKULIAH ( NO_MK CHAR(10), NAMA_MK VARCHAR2(30), PROGRAM_STUDI VARCHAR2(25)
); ALTER TABLE MATAKULIAH ADD ( CONSTRAINT PK_MATAKULIAH PRIMARY KEY (NO_MK) ); Untuk Table Nilai CREATE TABLE NILAI ( NO_MHS CHAR(10), NO_MK CHAR(10), NILAI NUMBER(5,2) ); ALTER TABLE NILAI ADD ( CONSTRAINT FK_NILAI_MAHASISWA FOREIGN KEY (NO_MHS) REFERENCES MAHASISWA (NO_MHS), CONSTRAINT FK_NILAI_MATAKULIAH FOREIGN KEY (NO_MK) REFERENCES MATAKULIAH (NO_MK) ); Dan Berikut ini adalah sintaks untuk MySQL Versi 5.0 : Untuk Table Mahasiswa CREATE TABLE MAHASISWA ( NO_MHS CHAR(10), NAMA_MAHASISWA VARCHAR(30), PROGRAM_STUDI VARCHAR(30), KOTA_ASAL VARCHAR(30) ); ALTER TABLE MAHASISWA ADD ( CONSTRAINT PK_MAHASISWA PRIMARY KEY (NO_MHS) ); Untuk Table Matakuliah
CREATE TABLE MATAKULIAH ( NO_MK char(10) NOT NULL, NAMA_MK VARCHAR(30) DEFAULT NULL, PROGRAM_STUDI VARCHAR(25) DEFAULT NULL, CONSTRAINT PK_MATAKULIAH PRIMARY KEY (`NO_MK`) ); Untuk Table Nilai CREATE TABLE NILAI ( NO_MHS VARCHAR(25) NOT NULL, NO_MK VARCHAR(10) NOT NULL, NILAI NUMERIC(5,2), CONSTRAINT FK_NILAI_MAHASISWA FOREIGN KEY (NO_MHS) REFERENCES MAHASISWA (NO_MHS), CONSTRAINT FK_NILAI_MATAKULIAH FOREIGN KEY (NO_MK) REFERENCES MATAKULIAH (NO_MK) )
Note : Saya sengaja untuk membuat script SQL dengan pola yang berbeda , hal ini bertujuan untuk memberi infomasi kepada pembaca setia blog saya hoho GR, bahwa sesungguhnya kemerdekaan itu adalah hak segala bangsa(lah kok malah nyambung ke UUD), haha maksudnya sesungguhnya ada berbagai macam cara untuk membuat script dengan bahasa SQL,Cmiiiw ☺ Oke berikut adalah gambaran dari ERD (Entity Relationship Diagramnya) : Oh ya gambar ERD‐nya saya buat dengan menggunakan Program TOAD for Oracle, tools favourite saya ketika sedang belajar Oracle ☺ Oke sekarang masukkan datanya sebagai berikut :
Data Tabel Mahasiswa : Insert into MAHASISWA (NO_MHS, NAMA_MAHASISWA, PROGRAM_STUDI, KOTA_ASAL) Values ('PA/11055', 'TIFTAZANI KHARA', 'ILMU KOMPUTER', 'JAKARTA'); Insert into MAHASISWA (NO_MHS, NAMA_MAHASISWA, PROGRAM_STUDI, KOTA_ASAL) Values ('PA/10514', 'RIZKA PRATININGRUM', 'KIMIA', 'SURABAYA'); Insert into MAHASISWA (NO_MHS, NAMA_MAHASISWA, PROGRAM_STUDI, KOTA_ASAL) Values ('KU/10514', 'RENDI AJI PRIHATININGSIH', 'PENDIDIKAN DOKTER', 'SIDOARJO'); Insert into MAHASISWA (NO_MHS, NAMA_MAHASISWA, PROGRAM_STUDI, KOTA_ASAL) Values ('PA/11514', 'ANDIKA PRATAMA', 'MATEMATIKA', 'BANJARMASIN'); Insert into MAHASISWA (NO_MHS, NAMA_MAHASISWA, PROGRAM_STUDI, KOTA_ASAL) Values ('PA/11111', 'ARIF PRIHUTOMO', 'ILMU KOMPUTER', 'PURWOREJO'); Insert into MAHASISWA (NO_MHS, NAMA_MAHASISWA, PROGRAM_STUDI, KOTA_ASAL) Values ('PA/10935', 'MIZAN RIZQIA', 'ILMU KOMPUTER', 'BOGOR'); Insert into MAHASISWA (NO_MHS, NAMA_MAHASISWA, PROGRAM_STUDI, KOTA_ASAL) Values ('EPA/9851', 'HERU KALIANDRA', 'ILMU KOMPUTER', 'PALANGKARAYA'); Insert into MAHASISWA (NO_MHS, NAMA_MAHASISWA, PROGRAM_STUDI, KOTA_ASAL) Values ('DPA/9851', 'HERA ANANTA', 'KOMSI', 'JAKARTA'); Insert into MAHASISWA (NO_MHS, NAMA_MAHASISWA, PROGRAM_STUDI, KOTA_ASAL) Values ('PA/9851', 'RIZKI ANANTA', 'FISIKA', NULL); COMMIT;
Oke, sebenarnya kalo di Oracle sih kalian bisa pake bahasa PL/SQL (Procedural Language/SQL), jadi cukup dimulai dengan Begin...dan diakhiri dengan End: ditambah dengan tanda”/” dipaling akhir , jadi lebih fleksibel soalnya tinggal meng‐execute sekali aja, gak usah berkali‐kali. Oh ya hampir lupa, perintah Commit ditujukan supaya perintah diatas menjadi bersifat permanen, kalau di MySQL biasanya otomatis, tetapi kalo di Oracle DEFAULT Autocommit‐nya OFF, jadi supaya datanya bersifat
permanen maka harus dikeluarkan perintah COMMIT , namun supaya anda‐anda semua (ca ileh) menginginkan Autocommitnya bersifat otomatis ,tinggal keluarkan saja perintah SET AUTOCOMMIT ON di SQL * Plus (Nama program Command Promptnya Oracle), Beresss kan? Maksudnya begini loh mas, mbak : Begin [Syntax diatas dicopy kesini] End; / Beress kan ? Data Tabel MATAKULIAH : Insert into MATAKULIAH (NO_MK, NAMA_MK, PROGRAM_STUDI) Values ('MMS‐100', 'BASIS DATA', 'ILMU KOMPUTER'); Insert into MATAKULIAH (NO_MK, NAMA_MK, PROGRAM_STUDI) Values ('MFS‐200', 'MEKANIKA KUANTUM', 'FISIKA'); Insert into MATAKULIAH (NO_MK, NAMA_MK, PROGRAM_STUDI) Values ('MKS‐300', 'KIMIA DASAR', 'KIMIA'); Insert into MATAKULIAH (NO_MK, NAMA_MK, PROGRAM_STUDI) Values ('MKS‐301', 'KIMIA ORGANIK', 'KIMIA'); Insert into MATAKULIAH (NO_MK, NAMA_MK, PROGRAM_STUDI) Values ('MFS‐100', 'FISIKA DASAR', 'FISIKA'); Insert into MATAKULIAH (NO_MK, NAMA_MK, PROGRAM_STUDI) Values ('MMS‐101', 'ALGORITMA DAN PEMROGRAMAN', 'ILMU KOMPUTER'); Insert into MATAKULIAH (NO_MK, NAMA_MK, PROGRAM_STUDI) Values ('KU‐100', 'ANATOMI', 'PENDIDIKAN DOKTER'); Insert into MATAKULIAH (NO_MK, NAMA_MK, PROGRAM_STUDI) Values ('KU‐101', 'BAHASA INGGRIS 1', 'PENDIDIKAN DOKTER');
Insert into MATAKULIAH (NO_MK, NAMA_MK, PROGRAM_STUDI) Values ('MMS‐1031', 'KALKULUS 1', 'MATEMATIKA'); Insert into MATAKULIAH (NO_MK, NAMA_MK, PROGRAM_STUDI) Values ('MMS‐1032', 'KALKULUS 1', 'ILMU KOMPUTER'); COMMIT; Data Tabel NILAI : Insert into NILAI (NO_MHS, NO_MK, NILAI) Values ('PA/11055', 'MMS‐101', 95); Insert into NILAI (NO_MHS, NO_MK, NILAI) Values ('PA/10514', 'MKS‐301', 85); Insert into NILAI (NO_MHS, NO_MK, NILAI) Values ('KU/10514', 'KU‐100', 100); Insert into NILAI (NO_MHS, NO_MK, NILAI) Values ('PA/10935', 'MMS‐101', 95); Insert into NILAI (NO_MHS, NO_MK, NILAI) Values ('PA/9851', 'MFS‐200', 75); Insert into NILAI (NO_MHS, NO_MK, NILAI) Values ('PA/9851', 'MMS‐100', 80); Insert into NILAI (NO_MHS, NO_MK, NILAI) Values ('PA/10935', 'MMS‐1032', 65); Insert into NILAI (NO_MHS, NO_MK, NILAI) Values ('PA/10514', 'MMS‐1031', 55); COMMIT;
Oke proses input data selesai, sekarang kita coba dulu ya hasilnya. Melihat data Tabel Mahasiswa ( Gambar from MySQL) Melihat data Tabel Matakuliah (Gambar dari SQL* Plus Oracle)
Melihat Data Tabel Nilai (Gambar dari SQL Plus Oracle via Command Prompt Windows)
Oke sekarang kita sudah melihat data ketiga tabel tersebut, sekarang kita akan masuk kebagian pertanyaan mengenai Query SQL. ‐ Tampilkan mahasiswa yang berasal dari kota Jakarta Jawab : Select * from Mahasiswa Where KOTA_ASAL= 'JAKARTA' ; ‐ Tampilkan Nomor dan Nama Mahasiswa Ilmu Komputer yang berasal dari kota Purworejo Jawab :
Select No_Mhs,Nama_Mahasiswa from MAHASISWA where Program_Studi='ILMU KOMPUTER' AND
KOTA_ASAL='PURWOREJO' :
‐ Tampilkan Nomor Mahasiswa Jurusan Kimia atau yang Mengambil Matakuliah denga kode MMS‐101 Jawab : Select No_Mhs from mahasiswa where Program_Studi='KIMIA' Union Select No_Mhs from Nilai where No_Mk='MMS‐101'; ‐ Tampilkan Nomor dan Nama Mahasiswa yang mengambil Matakuliah MMS‐100 Jawab :
Soal ini bisa menggunakan beberapa sintaks SQL,ada 2 versi SQL saat ini yaitu versi SQL/86 dan SQL/92. Sintaks SQL/92 Mulai support pada Oracle versi 9i keatas.
Menggunakan Sintaks Join dengan SQL/86:
Select Mahasiswa.No_Mhs, Mahasiswa.Nama_Mahasiswa from Mahasiswa,Nilai where Mahasiswa.No_Mhs=Nilai.No_Mhs and Nilai.No_Mk='MMS‐100'; Atau Menggunakan Sintaks Natural Join dengan SQL/92: Select No_Mhs,Nama_Mahasiswa from mahasiswa Natural Join Nilai where No_Mk='MMS‐100'; Atau Menggunakan Sintaks Inner Join dengan menggunakan Keyword ON pada SQL/92:
Select Nilai.No_Mhs, Mahasiswa.Nama_Mahasiswa from Mahasiswa Inner Join Nilai On Mahasiswa.No_Mhs=Nilai.No_Mhs where Nilai.No_Mk='MMS‐100';
Atau Menggunakan Sintaks Inner Join dengan menggunakan Keyword USING pada SQL/92:
Select No_Mhs, Mahasiswa.Nama_Mahasiswa from Mahasiswa Inner Join Nilai USING (No_Mhs) where Nilai.No_Mk='MMS‐100';
Hasil dari ketiga Sintaks SQL diatas akan mengembalikan hasil yang sama namun tentu saja menghasilkan performa yang berbeda, Sintaks dengan SQL/92 Relatif lebih cepat dibandingkan Sintaks dengan SQL/86. − Tampilkan Nomor Mahasiswa yang mengambil Matakuliah Basis Data Jawab : Select Nilai.No_Mhs from nilai Inner Join Matakuliah Using (No_Mk) where Nama_Mk='BASIS DATA'; Atau Select No_Mhs from Matakuliah Natural Join Nilai where Nama_Mk='BASIS DATA'; Atau
Select Nilai.No_Mhs from Nilai Inner Join Matakuliah On Nilai.No_Mk= Matakuliah.No_Mk where
Catatan : Saya menggunakan Fungsi UPPER pada sintaks ke 3, karena nilai Pada Kolom Nama_Mk bersifat Case Sensitive (Membedakan huruf besar dan kecil), karena pada saat pengisian data ke dalam tabel, semuanya diisi dengan Huruf Kapital semua, maka kita harus memberi Mengisi nilai dari Kolom dengan huruf Kapital pula, Fungsi UPPER disini berfungsi untuk merubah semua tulisan didalam tanda kurung kedalam Huruf Kapital. − Tampilkan Nomor dan Nama semua mahasiswa yang mengambil paling sedikit satu Matakuliah dari Program Studi Ilmu Komputer Jawab : Sebenarnya saya kurang setuju dengan Jawaban yang diberikan dikelas yang menjawab Sintaks berikut ini adalah yang benar. Select No_Mhs,Nama_Mahasiswa from Mahasiswa Natural Join Nilai Natural Join Matakuliah Where Matakuliah.Program_Studi='ILMU KOMPUTER'; Sintaks diatas akan mengembalikan hasil sebagai berikut :
Perlu diperhatikan kalau kita menggunakan sintaks diatas di Oracle, maka akan mengembalikan error,mengapa? Karena pada intinya Natural Join adalah Operasi biner (menggabungkan dua tabel
atau lebih) yang mengizinkan kita untuk mengkombinasikan beberapa seleksi/pemilihan tertentu terhadap hasil dari Cartesian Product kedalam satu operasi saja. Nah Operasi ini akan memerhatikan semua kolom yang memiliki Nama yang sama pada masing2 Tabel,sehingga hasil dari Natural Join ini tidak akan mengembalikan dua (atau lebih) kolom dengan nama yang sama.
Pada sintaks diatas pada klausa where, terdapat Sintaks Matakuliah.Program_Studi , Kita tidak diperkenankan menuliskan Matakuliah disini, karena Oracle akan mendeteksi secara otomatis darimana kolom itu berasal(ini sesuai dengan prinsip Natural Join, yang akan menyeleksi nama‐nama kolom yang memiliki kesamaan pada beberapa relasi tabel).
Jika kita memaksa untuk menggunakan sintaks diatas maka akan menghasilkan error sebagaimana pada gambar berikut : Maka sintaks yang tepat (pada Database Oracle) adalah dengan mengabaikan darimana Nama Kolom tersebut berasal, sehingga sintaksnya adalah sebagai berikut: Select No_Mhs,Nama_Mahasiswa from Mahasiswa Natural Join Nilai Natural Join Matakuliah Where Program_Studi='ILMU KOMPUTER'; dan hasil dari sintaks diatas sama persis dengan sintaks sebelumnya (pada MySQL).
Namun menurut saya ada hal lain yang perlu dicermati, yaitu bahwa sintaks diatas adalah hanya menganggap bahwa Mahasiswa yang mengambil Matakuliah dari program studi Ilmu Komputer, hanyalah mahasiswa yang berasal dari Program Studi Ilmu Komputer saja. Padahal pada kenyataannya ada Mahasiswa selain dari Program Studi lain semisal Matematika, yang mengambil matakuliah dari program studi Ilmu Komputer, sebagai contoh (di kampus saya) Matakuliah Algoritma dan Pemrograman.
Oleh karena itu, menurut saya sintaks diatas kurang tepat untuk diimplementasikan pada soal, sehingga sintaks yang tepat adalah yang menampilkan Nomor dan Nama Mahasiswa yang mengambil Matakuliah dari Program Studi Ilmu Komputer, meskipun Mahasiswa yang bersanggkutan bukan berasal dari Program Studi Ilmu Komputer.
Sehingga sintaks yang tepat adalah sebagai berikut : Select No_Mhs, Mahasiswa.Nama_Mahasiswa from Mahasiswa Inner Join Nilai Using(No_Mhs) Inner Join Matakuliah Using (No_Mk) Where Matakuliah.Program_Studi='ILMU KOMPUTER'; Hasil diatas menampilkan Mahasiswa bernama Rizki Ananta dengan Nomor Mahasiswa PA/9851, hasil ini adalah tepat karena jika diihat pada data pada Table Nilai(silahkan lihat gambar sebelum‐ sebelumnya yang menamplikan data pada Table Nilai) Mahasiswa dengan Nomor Mahasiswa PA/9851 , telah mengambil Matakuliah dengan kode MMS‐100 (Matakuliah Basis Data), yang mana Matakuliah tersebut berasal dari Program Studi Ilmu Komputer.
− Tampilkan Nomor dan semua Mahasiswa yang kota asalnya sama dengan kota asal dari
Mahasiswa dengan Nomor Mahasiswa DPA/9851
Jawab :
Select No_Mhs, Nama_Mahasiswa from Mahasiswa Where Kota_Asal = (Select Kota_Asal from
Mahasiswa where No_Mhs='DPA/9851');
− Hitunglah banyaknya Matakuliah yang sudah diambil oleh Mahasiswa Bernama Rizki Ananta
dan Nilainya Tidak Kurang dari 80
Jawab :
Select Count(Matakuliah.Nama_Mk) as “Jumlah kuliah yang diambil” from MATAKULIAH JOIN NILAI
USING (No_mk) JOIN MAHASISWA USING(No_Mhs) where Nama_Mahasiswa = (Select
Nama_Mahasiswa from Mahasiswa Inner Join Nilai USING (No_Mhs) where NAMA_Mahasiswa='RIZKI ANANTA' AND NILAI >=80);
− Buatah View yang hanya berisi Nomor Mahasiswa, Nama Mahasiswa , dan Nilai Rata‐rata, dan nilai Rata‐rata lebih dari atau sama dengan 80 , diurutkanberdasarkan Nilai Rata‐rata tertinggi. Jawab : Create or Replace view V_NILAI_RERATA AS Select No_Mhs, Mahasiswa.Nama_Mahasiswa , AVG(Nilai.Nilai) AS “Nilai Rata‐rata” from Mahasiswa Inner join Nilai using (No_Mhs) Group By No_Mhs,Mahasiswa.Nama_Mahasiswa Having AVG(Nilai.Nilai) >=80 Order By AVG(Nilai.Nilai) Desc; dan untuk melihat hasil dari view diatas adalah dengan mengeluarkan sintaks berikut : Select * From V_NILAI_RERATA;