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(nim, kodekuliah,
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;