{tocify} $title={Daftar Isi}
Pendahuluan
Pengelompokan data biasanya dilakukan agar mendapatkan suatu set nilai dari kelompok data tertentu, misalnya saja kita ingin mendapati jumlah mahasiswa berdasarkan pengelompokan jenis kelamin maka kita perlu memisahkan mahasiswa berdasarkan jenis kelaminnya dan kemudian menghitung jumlah mahasiswanya. Di MySQL sendiri pengelompokan data tersebut dapat dilakukan dengan menggunakan klausa group by yang biasanya digunakan bersamaan dengan fungsi agregat seperti count, max, min, dan avg, begitu juga dengan klausa Having seperti pembahasan mengenai fungsi agregat sebelumnya. Baik group by dan having berkaitan erat penggunaannya dengan fungsi agregat maka untuk memahami keduanya berikut ini penjelasan mengenai group by dan having di MySQL:
Group By
Klausa group by digunakan untuk menyeleksi data berdasarkan kelompok data yang ditentukan
mysql> select j_kelamin from mahasiswa group by j_kelamin;
+-----------+
| j_kelamin |
+-----------+
| L |
| P |
+-----------+
2 rows in set (0.04 sec)
mysql> select kota from mahasiswa group by kota;
+-----------------+
| kota |
+-----------------+
| Jakarta Barat |
| Jakarta Timur |
| Bekasi Utara |
| Bekasi Timur |
| Jakarta Selatan |
| Bogor |
| Bekasi Barat |
| Jakarta Utara |
| Bekasi Selatan |
| Jakarta Pusat |
| Bekasi |
+-----------------+
11 rows in set (0.02 sec)
Group by hanya akan mengembalikan hasil berdasarkan jumlah kelompok tersebut artinya jika pada kolom j_kelamin hanya terdapat dua jenis kelamin yakni L dan P maka hasil yang dikembalikan hanya L dan P begitu juga dengan kota. Group by juga erat kaitannya dengan fungsi agregat:
mysql> select count(j_kelamin) from mahasiswa where j_kelamin = "L";
+------------------+
| count(j_kelamin) |
+------------------+
| 61 |
+------------------+
1 row in set (0.00 sec)
mysql> select count(j_kelamin) from mahasiswa where j_kelamin = "P";
+------------------+
| count(j_kelamin) |
+------------------+
| 41 |
+------------------+
1 row in set (0.00 sec)
Sederhananya kita dapat mencari data dengan cara seperti diatas untuk mengetahui jumlah mahasiswa berjenis kelamin L dan P, namun dengan menggunakan group by maka kedua jenis kelamin tersebut akan dikelompokan dan mengembalikan hasil berdasarkan jumlah kelompok tersebut yakni L dan P, sedangkan jumlah nilai dari kelompok tersebut didapat dengan fungsi agregat contohnya sebagai berikut:
mysql> select count(j_kelamin) from mahasiswa group by j_kelamin;
+------------------+
| count(j_kelamin) |
+------------------+
| 61 |
| 41 |
+------------------+
2 rows in set (0.00 sec)
Having
Having umumnya juga digunakan bersamaan dengan klausa group by dan fungsi agregat sebagai pengganti klausa where karena memang klausa where tidak dapat digunakan bersamaan dengan fungsi agregat secara langsung sebagai filter data kecuali dengan menggunakan subquery, agar lebih memahaminya simak contoh berikut:
mysql> select dosen_id, gaji_pokok from gaji where gaji_pokok >= avg(gaji_pokok);
ERROR 1111 (HY000): Invalid use of group function
mysql> select dosen_id, gaji_pokok from gaji where gaji_pokok >= avg(gaji_pokok) group by dosen_id;
ERROR 1111 (HY000): Invalid use of group function
Dari hasil contoh diatas kita dapat lihat bahwa kita tidak dapat menggunakan fungsi agregat secara langsung dengan klausa where, maka untuk mengatasi hal itu kita hanya bisa menggunakan klausa having atau dengan subquery sebagai berikut:
mysql> select format(avg(gaji_pokok),0,"id_ID") as Gapok from gaji;
+------------+
| Gapok |
+------------+
| 14.350.000 |
+------------+
1 row in set (0.04 sec)
-- Dengan Having
mysql> select dosen_id, gaji_pokok from gaji group by dosen_id having avg(gaji_pokok) >= 14350000 limit 5;
+----------+------------+
| dosen_id | gaji_pokok |
+----------+------------+
| 8 | 15300000 |
| 10 | 18100000 |
| 11 | 18100000 |
| 12 | 19100000 |
| 13 | 20100000 |
+----------+------------+
5 rows in set (0.00 sec)
-- Dengan Subquery
mysql> select dosen_id, gaji_pokok from gaji where gaji_pokok > (select avg(gaji_pokok) from gaji) limit 5;
+----------+------------+
| dosen_id | gaji_pokok |
+----------+------------+
| 8 | 15300000 |
| 10 | 18100000 |
| 11 | 18100000 |
| 12 | 19100000 |
| 13 | 20100000 |
+----------+------------+
5 rows in set (0.00 sec)
Jadi pada dasarnya fungsi klausa having digunakan untuk menggantikan klausa where apabila menggunakan fungsi agregat untuk menyeleksi (filter) data adapun klausa where hanya dapat digunakan dengan subquery.