Rabu, 19 Desember 2012

About SubQuery SQL


Di dalam statement SQL bisa terdapat subquery lagi atau dengan kata lain ‘query dalam query’ atau disebut juga ‘nested query’. Hal ini tidak hanya terjadi pada statement SELECT, namun dapat pula terjadi pada statement UPDATE dan DELETE.

Untuk studi kasus, lagi-lagi kita ambil sampel yang terkait dengan nilai matakuliah mahasiswa, karena merupakan sampel yang paling mudah dalam pemahamannya. Berikut ini adalah struktur tabel yang digunakan beserta recordnya.

CREATE TABLE mhs (
nim     varchar(5),
namaMhs varchar(30),
PRIMARY KEY(nim)
);
INSERT INTO mhs VALUES
('001', 'Joko'),
('002', 'Amir'),
('003', 'Budi');

CREATE TABLE mk (
kodeMK    varchar(5),
namaMK    varchar(20),
sks       int(11),
PRIMARY KEY(kodeMK)
);
INSERT INTO mk VALUES
('A01', 'Kalkulus', 3),
('A02', 'Geometri', 2),
('A03', 'Aljabar', 3);

CREATE TABLE ambilmk (
nim    varchar(5),
kodeMK varchar(5),
nilai  int(11),
PRIMARY KEY(nim, kodeMK)
);
INSERT INTO ambilmk VALUES
('001', 'A01', 3),
('001', 'A02', 4),
('001', 'A03', 2),
('002', 'A02', 3),
('002', 'A03', 2),
('003', 'A01', 4),
('003', 'A03', 3);
Selanjutnya misalkan ada pertanyaan-pertanyaan sebagai berikut ini:
  1. Tampilkan nama mahasiswa dan nilai matakuliah yang memiliki nilai tertinggi dalam matakuliah ‘A02′.
  2. Dalam perkuliahan dengan kode ‘A03′, siapakah mahasiswa (nim dan nama) yang memiliki nilai di atas rata-rata nilai dari semua mahasiswa yang mengambil matakuliah tersebut?
  3. Dari data mahasiswa yang terdaftar, siapa sajakah (nama) mahasiswa yang tidak mengambil matakuliah ‘A01′?
JAWABAN:
1.      Untuk pertanyaan ini, mungkin Anda mengira query atau statement SQL nya berbentuk seperti ini:
SELECT mhs.namaMhs, ambilmk.nilai
FROM mhs, ambilmk
WHERE mhs.nim = ambilmk.nim AND ambilmk.kodeMK = 'A02' AND
      ambilmk.nilai = MAX(ambilmk.nilai);

Apabila query di atas dijalankan, maka akan terjadi error karena penggunaan aggregate function (dalam hal ini MAX) tidak boleh diletakkan dalam WHERE. Aggregate function hanya boleh diletakkan di bagian SELECT dan HAVING. Sehingga query yang benar adalah sebagai berikut:
SELECT mhs.namaMhs, ambilmk.nilai
FROM mhs, ambilmk
WHERE mhs.nim = ambilmk.nim AND ambilmk.kodeMK = 'A02' AND
      ambilmk.nilai = (SELECT MAX(nilai)
                       FROM ambilmk
                       WHERE kodeMK = 'A02');

Perhatikan perintah di atas, terutama pada bagian SELECT MAX(nilai) FROM ambilmk WHERE kodeMK = ‘A02′. Bagian ini disebut dengan subquery. Perintah tersebut digunakan untuk mencari nilai tertinggi untuk matakuliah ‘A02′. Hasil dari subquery ini nantinya digunakan sebagai syarat untuk query yang berada di level atasnya (parent query).

2.      Untuk pertanyaan ini, Anda mungkin juga mengira querynya berbentuk seperti ini
SELECT mhs.nim, mhs.namaMhs
FROM mhs, ambilmk
WHERE mhs.nim = ambilmk.nim AND ambilmk.kodeMK = 'A03' AND
      ambilmk.nilai > AVG(ambilmk.nilai);

Apabila Anda jalankan, maka akan terjadi error. Penyebabnya sama dengan error yang terjadi pada soal No. 1, yaitu adanya aggregate function (dalam hal ini AVG()) dalam WHERE.
Statement SQL yang benar adalah:
SELECT mhs.nim, mhs.namaMhs
FROM mhs, ambilmk
WHERE mhs.nim = ambilmk.nim AND ambilmk.kodeMK = 'A03' AND
      ambilmk.nilai > (SELECT AVG(nilai)
                       FROM ambilmk
                       WHERE kodeMK = 'A03');

3.       Kita lanjutkan ke pertanyaan No. 3.
Secara logika, untuk menjawab pertanyaan ini adalah kita buat 2 buah query, yaitu query pertama untuk menampilkan semua mahasiswa yang terdaftar di database dan query kedua untuk menampilkan mahasiswa yang mengambil matakuliah ‘A01′. Selanjutnya hasil query pertama dibandingkan dengan hasil query kedua. Dan sebagai outputnya atau yang ditampilkan adalah mahasiswa yang ada di hasil query pertama namun tidak ada di hasil query kedua. Implementasi logika:
SELECT nim, namaMhs
FROM mhs
WHERE nim NOT IN
      (SELECT nim FROM ambilmk WHERE kodeMK = 'A01');

Maksud dari klausa WHERE nim NOT IN (SELECT nim FROM ambilmk WHERE kodeMK = ‘A01′) adalah bahwa syarat yang ditampilkan adalah nim yang ada di tabel mhs namun tidak terdapat (NOT IN) di hasil subquery SELECT nim FROM ambilmk WHERE kodeMK = ‘A01′ (nim yang mengambil ‘A01′).


Senin, 26 November 2012

Dependensi dan Normalisasi


FUNCTIONAL DEPENDENCY
·         Functional Dependency atau Ketergantungan Fungsional menggambarkan hubungan attributes dalam sebuah relasi
·         Suatu attribute bisa disebut memnuhi  functionally dependant  jika kita menggunakan nilai atribut tersebut untuk menentukan nilai atribut yang lain.
·         Functional Dependency  dapat disimbolkan dengan:
A -> B : tanda -> dibaca secata fungsional menentukan.
Berarti A secara fungsional menentukan B atau B secara fungsional tergantung pada A.
Contoh:
Tabel Mahasiswa
NIM
NAMA
5302411049
Galuh Puspita Ariputri
5302411050
Isnaeni
5302411051
Nurul Khoiriyah
Ketergantungan fungsional dari tabel mahasiswa adalah NIM -> NAMA

MACAM MACAM DEPENDENCY
Full Functional Dependendency
Definisi : Suatu atribut Y mempunyai dependensi fungsional penuh terhadap X jika
  • B memiliki dependensi fungsional terhadap A dan/atau
  • B tidak memiliki dependensi terhadap subset dari A
NIM
NAMA
IPK
RUANG
DOSEN
5302411049
Galuh Puspita Ariputri
3,8
304
Abi
5302411050
Isnaeni
3,7
101
Bagus
5302411051
Nurul Khoiriyah
3,6
208
Candra

Contoh : {  NIM,NAMA } à RUANG bukan merupakan full functional dependency
{ NIM } –>  RUANG merupakan full functional dependency

Dependensi Total
Definisi : Suatu atribut B mempunyai dependensi total terhadap atribut A jika
  • B memiliki dependensi fungsional terhadap A dan
  • A memiliki dependensi fungsional terhadap B
Notasi  :   A <–> B
Contoh : Tabel Pemasok
KodePemasok
NamaPemasok
Kota
01
Abi
Semarang
02
Bagus
Kendal
03
Candra
Jepara

Pada kasus ini  KodePemasok <–>NamaPemasok, karena setiap kode tidak mempunyai nama yang sama.

Dependensi Transitif
Definisi : Atribut C mempunyai dependensi transitif terhadap A bila :
  • B memiliki dependensi fungsional terhadap A
  • C memiliki dependensi fungsional terhadap B
Contoh :
MataKuliah
Ruang
Tempat
Waktu
Sistem Basis Data
304
E6
Jum’at
Metode Numerik
101
E8
Rabu
Kewirausahaan
208
E2
Senin

Relasi :
  • MataKuliah  –> {Ruang, Waktu}
  • Ruang  –> Tempat
Terlihat bahwa :    MataKuliah –> Ruang –> Tempat
Dengan demikian Tempat mempunyai dependensi transitif terhadap kuliah

NORMALISASI
·         Normalisasi merupakan proses pembentukan struktur basis data untuk menghilangkan sebagian besar anomali dan menciptakan struktur tabel yang efisien.
·         Anomali adalah proses pada basis data yang memberikan efek samping yang tidak diharapkan, misalnya menyebabkan ketidak konsistenan data atau membuat sesuatu data menjadi hilang ketika data lain dihapus.
·         Macam-macam anomali:
1.       Anomali Peremajaan/Edit/Update
Anomali ini terjadi apabila terjadi pengubahan terhadap sejumlah data yang mubazir, tetapi tidak seluruhnya di ubah.
2.       Anomali Penyisipan/insert
Anomali penyisipan terjadi jika pada saat penambahan hendak dilakukan ternyata ada elemen data yang masih kosong dan elemen tersebut justru menjadi kunci.
3.       Anomali Penghapusan/delete
Anomali penghapusan terjadi sekiranya sesuatu baris (tuple) yang tak terpakai dihapus dan sebagai akibatnya terdapat data lain yang akan hilang.
·         Tahap Normalisasi dimulai dari tahap paling ringan (1NF) hingga paling ketat (5NF) namun terkadang hanya mencapai 3NF atau BCNF saja karena dianggap cukup sebagai struktur atau tabel yang berkualitas.

BENTUK-BENTUK NORMALISASI 

                  1. Bentuk Normal Tahap Pertama (1st Normal Form / 1NF)
Sebuah keadaan yang membuat perpotongan baaris dan kolom hanya berisis satu nilai.
Syarat:
-          Bentuk normal 1NF terpenuhi jika sebuah tabel tidak memiliki atribut bernilai banyak (multivalued attribute), atribut composite atau kombinasinya dalam domain data yang sama.
-          Setiap atribut dalam tabel tersebut harus bernilai atomic (tidak dapat dibagi-bagi lagi)
Contoh:
UNF
NIDN
NAMA_DOSEN
NO_TELEPON
2002122
Abi
085673849221, 081776389273
2002123
Bagus
087767655492
2002124
Candra
089935521767, 086552451189, 080989111

1NF
NIDN
NAMA_DOSEN
NO_TELEPON
2002122
Abi
085673849221
2002122
Abi
081776389273
2002123
Bagus
087767655492
2002124
Candra
089935521767
2002124
Candra
086552451189
2002124
Candra
080989111

  
      2. Bentuk Normal Tahap Kedua (2nd Normal Form / 2NF)
Syarat:
-          Bentuk normal 2NF terpenuhi dalam sebuah tabel jika telah memenuhi bentuk 1NF, dan semua atribut selain primary key, secara utuh memiliki Functional Dependency pada primary key
-          Sebuah tabel tidak memenuhi 2NF, jika ada atribut yang ketergantungannya (Functional Dependency) hanya bersifat parsial saja (hanya tergantung pada sebagian dari primary key)
-          Jika terdapat atribut yang tidak memiliki ketergantungan terhadap primary key, maka atribut tersebut harus dipindah atau dihilangkan
Contoh:
1NF
No_pegawai
Nama_pegawai
No_customer
Nama_customer
120
Abi
01
Tiara
120
Abi
02
Baiti
121
Bagus
03
Nina
122
Candra
04
Ichma
122
Candra
05
Tika
122
Candra
06
Bella

2NF
No_pegawai
Nama_pegawai
120
Abi
120
Abi
121
Bagus
122
Candra
122
Candra
122
Candra


No_customer
Nama_customer
01
Tiara
02
Baiti
03
Nina
04
Ichma
05
Tika
06
Bella








No_pegawai
No_customer
120
01
120
02
121
03
122
04
122
05
122
06


       3. Bentuk Normal Tahap (3rd Normal Form / 3NF)
Syarat:
-          Bentuk normal 3NF terpenuhi jika telah memenuhi bentuk 2NF, dan jika tidak ada atribut non primary key yang memiliki ketergantungan terhadap atribut non primary key yang lainnya.
Contoh:
2NF
NIDN
Nama_dosen
Alamat
Kota
Provinsi
Kode_pos
2002122
Abi
Jl. Merpati
Semarang
Jateng
50229
2002123
Bagus
Jl.Siliwangi
Pontianak
Kalbar
54331
2002124
Candra
Jl.Patemon
Kediri
Jatim
52614
2002125
Dedi
Jl.Griya Asri
Bandung
Jabar
52111

NiDN -> { Nama_dosen, Alamat, Kota, Provinsi, Kode_pos}
Kode_pos -> { Kota, Provinsi}

3NF
NIDN
Nama_dosen
Alamat
Kode_pos
2002122
Abi
Jl. Merpati
50229
2002123
Bagus
Jl.Siliwangi
54331
2002124
Candra
Jl.Patemon
52614
2002125
Dedi
Jl.Griya Asri
52111

Kota
Provinsi
Kode_pos
Semarang
Jateng
50229
Pontianak
Kalbar
54331
Kediri
Jatim
52614
Bandung
Jabar
52111
  
      4. Boyce-Code Normal Form (BCNF)
Syarat:
-          Bentuk BCNF terpenuhi dalam sebuah tabel, jika untuk setiap functional dependency terhadap setiap atribut atau gabungan atribut dalam bentuk:             A à B maka A adalah super key
-          Tabel tersebut harus di-dekomposisi berdasarkan functional dependency yang ada, sehingga A menjadi super key dari tabel-tabel hasil dekomposisi
-          Setiap tabel dalam BCNF merupakan 3NF. Akan tetapi setiap 3NF belum tentu termasuk BCNF .

5. Bentuk Normal Tahap (4th Normal Form / 4NF)
Syarat:
-          Bentuk normal 4NF terpenuhi dalam sebuah tabel jika telah memenuhi bentuk BCNF, dan tabel tersebut tidak boleh memiliki lebih dari sebuah multivalued atribute
-          Untuk setiap multivalued dependencies (MVD) juga harus merupakan functional dependencies
  
      6. Bentuk Normal Tahap (5th Normal Form / 5NF)
Syarat:
-          Bentuk normal 5NF terpenuhi jika tidak dapat memiliki sebuah lossless decomposition menjadi tabel-tabel yg lebih kecil.
-          Jika 4 bentuk normal sebelumnya dibentuk berdasarkan functional dependency, 5NF dibentuk berdasarkan konsep join dependence. Yakni apabila sebuah tabel telah di-dekomposisi menjadi tabel-tabel lebih kecil, harus bisa digabungkan lagi (join) untuk membentuk tabel semula