Selasa, 20 Januari 2015

Sistem Basis Data (Agregat dan Distink)

 Query dalam  MySQL yang menggunakan fungsi agregat, group by dan having. Tabel-tabel yang akan digunakan adalah sebagai berikut:
  • matakuliah(kodemk, namamk, sks), berisi daftar matakuliah yang ditawarkan
  • dosen(nip, nama), berisi daftar dosen pengampu kuliah
  • mahasiswa(nim, nama, dosenpembimbing), berisi daftar mahasiswa
  • kuliah(kodekuliah, kodemk, nip, thnakademik, semester), berisi daftar matakuliah dan dosen pengampu
  • peserta(nimkodekuliah, nilai), berisi kuliah yang diikuti mahasiswa beserta nilainya dalam huruf
Dalam pembahasan kali ini diasumsikan:
  • matakuliah hanya ditawarkan sekali dalam setahun, yaitu pada semester 1 (ganjil) saja atau semester 2 (genap) saja dan tidak kedua-duanya.
  • bila pernah mengulang matakuliah, nilai yang diikutkan untuk perhitungan IP adalah nilai terakhir
  • matakuliah dikatakan lulus bila nilai yang diperoleh minimal ‘D’
Berikut ini adalah contoh-contoh query dalam MySQL:
1.      Menampilkan banyaknya SKS yang telah diselesaikan oleh masing-masing mahasiswa
a.       Bila matakuliah yang diulang semua masuk dalam perhitungan
SELECT nim, SUM( sks ) jumlahsks
FROM peserta, (
SELECT kodekuliah, kuliah.kodemk, sks
FROM kuliah, matakuliah
WHERE kuliah.kodemk = matakuliah.kodemk
) A
WHERE peserta.kodekuliah = A.kodekuliah
GROUP BY nim
Penjelasan:
Pada query ini menampilkan jumlah SKS yang telah diselesaikan oleh masing-masing mahasiswa bila matakuliah yang diulang semua masuk dalam perhitungan. Pertama-tama, melakukan join tabel kuliah dengan tabel matakuliah pada kondisi kodemk pada tabel kuliah sama dengan kodemk pada tabel matakuliah untuk mendapatkan kodekuliah, kodemk dan sks.
…(
SELECT kodekuliah, kuliah.kodemk, sks
FROM kuliah, matakuliah
WHERE kuliah.kodemk = matakuliah.kodemk
) A
Lalu hasil join tersebut diberi alias A. Selanjutnya, tabel A tadi  join-kan dengan tabel peserta pada kondisi kodekuliah pada tabel peserta sama dengan kodekuliah pada tabel A untuk mendapatkan nim dan sks yang selanjutnya menjumlahkan sks dengan SUM(sks) yang dikelompokkan berdasarkan nim menggunakan GROUP BY nim.
b.      Bila matakuliah yang diulang hanya yang sesuai dengan asumsi yang masuk dalam perhitungan
SELECT nim, SUM( sks ) totalsks
FROM (
SELECT DISTINCT nim, kodemk
FROM peserta, kuliah
WHERE peserta.kodekuliah = kuliah.kodekuliah
)P, matakuliah
WHERE P.kodemk = matakuliah.kodemk
GROUP BY nim
Penjelasan:
Pada query ini menampilkan jumlah SKS yang telah diselesaikan oleh masing-masing mahasiswa bila matakuliah yang diulang  hanya dihitung sekali. Pertama-tama  melakukan join tabel peserta dengan tabel kuliah pada kondisi kodekuliah pada tabel peserta sama dengan kodekuliah pada tabel kuliah untuk mendapatkan nim dan kodemk.
… (
SELECT DISTINCT nim, kodemk
FROM peserta, kuliah
WHERE peserta.kodekuliah = kuliah.kodekuliah
)P …
Kata DISTINCT setelah SELECT digunakan untuk menghilangkan pengulangan  record yang mempunyai nim dan kodemk yang sama agar matakuliah yang diulang oleh seorang mahasiswa hanya muncul sekali. Hasil join tersebut diberi alias P. Lalu tabel P  join-kan dengan tabel matakuliah pada kondisi kodemk pada tabel P sama dengan kodemk pada tabel matakuliah untuk mendapatkan nim dan sks yang dijumlahkan dengan SUM(sks) setelah dikelompokkan berdasarkan GROUP BY nim.
2.      Menampilkan data-data yang bisa untuk melakukan perhitungan IPK (berdasar asumsi di atas)
SELECT nim, kuliah.kodemk, nilai, sks
FROM peserta, matakuliah, kuliah
WHERE kuliah.kodekuliah = peserta.kodekuliah
AND kuliah.kodemk = matakuliah.kodemk
AND (
nim, kuliah.kodemk, thnakademik
)
IN (
SELECT nim, kodemk, MA thnakademik ) thnterakhir
FROM peserta, kuliah
WHERE kuliah.kodekuliah = peserta.kodekuliah
GROUP BY nim, kodemk
)
Penjelasan:
Pada query ini  melakukan join pada tiga tabel, yaitu peserta, matakuliah dan kuliah dengan kondisi kodekuliah pada tabel kuliah sama dengan kodekuliah pada tabe lpeserta dan kodemk pada tabel  kuliah sama dengan kodemk pada tabel matakuliah. Setelah itu  lakukan operasi intersection dengan query yang menampilkan tahun terakhir menyelesaikan suatu matakuliah.
AND (
nim, kuliah.kodemk, thnakademik
)
IN (
SELECT nim, kodemk, MA  thnakademik ) thnterakhir
FROM peserta, kuliah
WHERE kuliah.kodekuliah = peserta.kodekuliah
GROUP BY nim, kodemk
)
Pada query untuk menampilkan tahun terakhir menyelesaikan suatu matakuliah,  melakukan join pada tabel peserta dan tabel kuliah dengan kondisi kodekuliah pada tabel kuliahsama dengan kodekuliah pada tabel peserta. Lalu untuk mencari tahun terakhir digunakan fungsi MA thnakademik )  setelah dikelompokkan berdasarkan nim dan kodemk dengan GROUP BY nim, kodemk. Lalu operasi intersection dilakukan dengan memeriksa apakah record nim, kodemk, thnakademik dari hasil join tiga tabel ada pada hasil query untuk menampilkan tahun terakhir menyelesaikan suatu matakuliah.
3.      Menampilkan dosen yang pernah mengampu kelas matakuliah yang pesertanya tidak lebih dari 15 mahasiswa
SELECT DISTINCT nip
FROM kuliah, (
SELECT kodekuliah, COUNT( * ) jumlahpeserta
FROM peserta
GROUP
BY kodekuliah
) banyakpeserta
WHERE kuliah.kodekuliah = banyakpeserta.kodekuliah
AND jumlahpeserta <=15
Penjelasan:
Pada query ini akan menampilkan dosen yang pernah mengampu  matakuliah yang pesertanya <= 15 mahasiswa. Awalnya menggunakan tabel peserta,  hitung dahulu jumlah peserta dari setiap kuliah dengan menggunakan COUNT setelah dikelompokkan berdasarkan kodekuliah dengan GROUP BY kodekuliah.
…(
SELECT kodekuliah, COUNT( * ) jumlahpeserta
FROM peserta
GROUP
BY kodekuliah
) banyakpeserta
Setelah itu query tersebut diberi alias banyak peserta. Lalu pada query utama  melakukan join pada tabel banyakpeserta dengan tabel kuliah pada kondisi kodekuliah pada tabel kuliah sama dengan kode kuliah pada tabel banyak peserta serta menambahkan kondisi jumlahpeserta <= 15. Pada query utama menampilkan nip yang di dahului dengan kataDISTINCT agar nip yang ditampilkan tidak ada perulangan.

Fungsi GROUP BY dan HAVING berkaitan dengan fungsi agregat. Fungsi agregat merupakan kelompok fungsi di MySQL yang memungkinkan untuk memiliki parameter berupa kelompok data. Sebagai contoh dari fungsi agregat adalah fungsi SUM() yang akan menjumlahkan seluruh nilai yang menjadi parameternya. Contoh lain adalah fungsi MAX() yang akan menghasilkan nilai terbesar dari keseluruhan nilai yang menjadi parameternya.

Name
Description
Return the average value of the argument
Return bitwise and
Return bitwise or
Return bitwise xor
Return the count of a number of different values Berikut
Return a count of the number of rows returned
Return a concatenated string
Return the maximum value
Return the minimum value
Return the population standard deviation
Return the population standard deviation
Return the sum
Return the population standard variance



 Buatlah tabel nilai yang menyimpan data nilai mahasiswa, strukturnya sebagai berikut:

Column
Type
Comment
Nim
nchar(10)
 Nim mahasiswa
Nama
varchar(30)
 Nama mahasiswa
Matkul
varchar(20)
 Nama Matakuliah
Nilai
int(3)
 Nilai mahasiswa

1. Tampilkan rata-rata nilai dari seluruh mahasiswa.
Untuk menyelesaikannya tidak perlu menggunakan GROUP BY karena yang diminta adalah seluruh mahasiswa. Untuk mendapatkan rata-rata nilai  menggunakan fungsi AVG(). Berikut ini query untuk kasus tersebut.

SELECT AVG(nilai) as rata_rata FROM nilai;
2. Tampilkan rata-rata nilai untuk setiap mahasiswa
Karena yang diminta adalah rata-rata untuk setiap mahasiswa  menggunakan GROUP BY untuk mengelompokkan rata-rata berdasarkan field tertentu. Query dan hasilnya  sebagai berikut:

SELECT nim, nama, AVG(nilai) as rata_rata FROM nilai GROUP BY nim, nama;

3. Tampilkan nilai terbesar dan terkecil untuk setiap mahasiswa.
Agregat yang digunakan untuk menampilkan nilai terbesar dan terkecil yaitu MAX() dan MIN(). Berikut ini query dan hasil query-nya.

SELECT nim, nama, MAX(nilai) as terbesar, MIN(nilai) as terkecil FROM nilai;
4. Tampilkan rata-rata nilai yang didapat mahasiswa untuk setiap matakuliah
 Querynya kurang lebih sebagai berikut:
SELECT matkul, AVG(nilai) as rata_rata FROM nilai GROUP BY matkul;

5. Tampilkan rata-rata nilai untuk setiap mahasiswa, yang rata-rata nilai lebih besar dari 80
Yang ingin ditampilkan adalah hanya mahasiswa yang nilainya lebih dari 80. Query  sebagai berikut:

SELECT nim, AVG(nilai) as rata_rata FROM nilai GROUP BY nim HAVING AVG(nilai)>80;



0 komentar: