Setelah kegiatan pembelajaran ini, diharapkan:
- Siswa mampu memahami perintah grouping dalam basis data
- Siswa mampu menuliskan perintah fungsi agregasi dengan pengelompokan data dengan benar
- Siswa mampu menerapkan fungsi agregasi dengan pengelompokan data dalam basis data
Selain dapat mengelompokkan data menggunakan GROUP BY, MariaDB juga memungkinkan kita memfilter kelompok mana yang akan disertakan dan mana yang dikecualikan.
Misalnya, kita menginginkan daftar total gaji pokok para karyawan berdasarkan ruang dimana total nominalnya hanya yang di bawah sepuluh juta. Untuk mendapatkan data ini, kita harus memfilter berdasarkan kelompok lengkap, bukan pada baris individu. WHERE tidak berfungsi di sini karena WHERE memfilter baris tertentu, bukan kelompok. Faktanya, WHERE tidak tahu apa itu kelompok.
MariaDB menyediakan klausa HAVING. HAVING sangat mirip dengan WHERE. Faktanya, semua jenis klausa WHERE yang kita gunakan sejauh ini juga dapat digunakan dengan HAVING. Satu-satunya perbedaan adalah WHERE memfilter baris dan HAVING memfilter grup/kelompok data.
Jadi, jika perintah SELECT menggunakan WHERE untuk menentukan kondisi, maka perintah GROUP BY menggunakan HAVING. Pemakaian HAVING bersama dengan GROUP BY digunakan untuk menentukan kondisi bagi GROUP BY. Perintah HAVING hanya dapat digunakan jika GROUP BY digunakan. Kemudian, hasilnya berupa kelompok yang memenuhi kondisi saja. Karena HAVING mencari dari tabel setelah pengelompokan, kolom yang digunakan dalam pernyataan kondisional selalu menggunakan kolom dari tabel yang dikelompokkan.
HAVING biasanya digunakan untuk menentukan kondisi tertentu pada GROUP BY dan kondisi tersebut berkaitan dengan fungsi agregasi. Format dasar yang digunakan adalah sebagai berikut.
SELECT FUNCTION_AGGREGATE(nama_kolom) FROM nama_tabel GROUP BY nama_kolom HAVING kondisi_untuk_agregasi;
Perhatikan contoh penerapan perintah GROUP BY dengan HAVING di bawah ini!
Tabel yang kita gunakan adalah data_guru yang dapat dilihat seperti di bawah ini.
id_guru | nip | nama | jns_kel | gaji | pendidikan_terakhir |
---|---|---|---|---|---|
G01 | 13254 | Indah Wijaya | P | 4000000 | S1 |
G02 | 14325 | Siska Nur Azizah | P | 4500000 | S1 |
G03 | 12543 | Fauzi Rahmadi | L | 5000000 | S2 |
G04 | 15234 | Luna Ardhita Puspita | P | 3000000 | D3 |
G05 | 13542 | Hafizh | L | 4200000 | S1 |
G06 | 15432 | Dita Anggraini | P | 4800000 | S2 |
G07 | 12235 | Farhan Alfi | L | 3500000 | D3 |
Misalkan kita ingin menampilkan total gaji guru berdasarkan pendidikan terakhirnya dimana total nominalnya di bawah sepuluh juta dan diurutkan dari nominal terbesar. Kita dapat menggunakan kueri sebagai berikut.
Hasilnya adalah:
Cobalah kueri di atas pada kotak inputan coba kueri di bawah ini.
Contoh selanjutnya, tabel yang kita gunakan adalah biodata_siswa yang dapat dilihat seperti di bawah ini.
id_siswa | nis | nama | jns_kel | umur | tinggi_badan | berat_badan |
---|---|---|---|---|---|---|
S01 | 13261 | Aisyah Alifa | P | 17 | 155 | 45 |
S02 | 13262 | Rendra Kurniawan | L | 18 | 173 | 55 |
S03 | 13263 | Iqbal Maulana Hakim | L | 19 | 165 | 50 |
S04 | 13264 | Gracia Putri Lestari | P | 18 | 158 | 46 |
S05 | 13265 | Nanda Amira Athaya | P | 17 | 156 | 41 |
S06 | 13266 | Fajar Setiawan | L | 17 | 153 | 45 |
S07 | 13267 | Naura Athalia | P | 18 | 171 | 60 |
S08 | 13268 | Irfan Maulana | L | 17 | 163 | 58 |
S09 | 13269 | Yudi Prasetyo Nugroho | L | 19 | 175 | 62 |
S10 | 13270 | Rayhanah Aziza | P | 19 | 154 | 43 |
Apakah perlu menggunakan klausa WHERE dan HAVING dalam satu pernyataan? Sebenarnya, ya, ada. Misalkan kita ingin menampilkan rata-rata tinggi badan siswa yang berjenis kelamin laki-laki saja dan dikelompokkan berdasarkan umurnya dimana rata-rata tingginya yang lebih dari atau sama dengan 170. Kita dapat menggunakan kueri sebagai berikut.
Hasilnya adalah:
Cobalah kueri di atas pada kotak inputan coba kueri di bawah ini.
WHERE memfilter sebelum data dikelompokkan, dan HAVING memfilter setelah data dikelompokkan. Sehingga baris yang dihilangkan oleh klausa WHERE tidak termasuk dalam kelompok umur.
Klausa WHERE memfilter semua baris dengan jenis kelamin laki-laki. Data kemudian dikelompokkan berdasarkan umur, dan kemudian klausa HAVING hanya memfilter grup tersebut dengan rata-rata tinggi badannya 170 atau lebih. Tanpa klausa WHERE, maka tidak ada data yang diambil karena rata-rata tinggi untuk setiap umur tanpa melihat jenis kelamin adalah di bawah 170.
Untuk melihat kemampuan menuliskan perintah GROUP BY dengan HAVING dan menerapkannya dalam basis data, silahkan kerjakan latihan di bawah ini.
Lengkapilah kueri di bawah ini dengan mengetikkan jawaban pada kotak inputan yang disediakan. Border kotak inputan berwarna hijau jika jawaban Anda benar dan berwarna merah jika jawaban Anda salah.
Perintah: Menampilkan total insentif yang diambil dari kolom insentif, dengan nama kolom alias total_insentif dari tabel dengan nama kinerja, dan kelompokkan berdasarkan kategori_kinerja dengan total_insentif lebih dari 0.
SELECT kategori_kinerja, AS total_insentif FROM kinerja
> 0;
SELECT kategori_kinerja, SUM(insentif) AS total_insentif FROM kinerja
GROUP BY kategori_kinerja
HAVING total_insentif > 0;
Tabel telah tersedia dengan nama
Tampilkanlah total gaji pokok karyawan dengan nama kolom alias total_gapok yang dikelompokkan berdasarkan divisi, dimana nominal total gaji pokok lebih dari 30000000
Hasilnya adalah:
Tabel telah tersedia dengan nama
Tampilkanlah total anggaran proyek dengan nama kolom alias total_anggaran yang dikelompokkan berdasarkan status, dimana nominal total anggaran kurang dari 100000000, data diurutkan dari total anggaran yang paling besar
Hasilnya adalah:
Kamu menjawab dari 3 soal dengan benar!