Pengertian dan Penggunaan Fungsi Agregat Pada MySQL

Fungsi agregate adalah fungsi yang menerima sejumlah nilai dan mengembalikannya dengan hasil nilai tunggal, contohnya seperti menentukan nilai terendah, tertinggi, nilai rata-rata pada satu set nilai, dan menghitung jumlah record/baris data yang tersimpan. Ada beberapa fungsi agregate yang sering digunakan pada MySQL, diantaranya:

Fungsi Keterangan
Count Menghitung jumlah record/baris data yang tersimpan
SUM Menjumlahkan total nilai yang tersimpan pada sebuah kolom
AVG Mencari untuk mencari nilai rata-rata pada sebuah kolom
Min Mencari nilai terendah
Max Mencari nilai tertinggi

Adapun contoh penggunaannya adalah sebagai berikut:
mysql> Select gaji_pokok from gaji order by gaji_pokok asc;
+------------+
| gaji_pokok |
+------------+
|    6100000 |
|    7100000 |
|    7100000 |
..............
|    8100000 |
+------------+
30 rows in set (0.00 sec)
Note: Data di persingkat.
Pada contoh diatas kita ingin menentukan gaji pokok terkecil, tertinggi, rata-rata ataupun total keseluruhan gaji pokok, kita mungkin dapat menggunakan klausa order namun cara tersebut tidak begitu efektif karena banyaknya nilai yang dikembalikan maka dari itu kita bisa menggunakan fungsi agregat. Berikut adalah bentuk umum dan contoh penggunaan fungsi agregat mysql:

SUM

mysql> select sum(nama_kolom) {as nama_alias_tabel} from tabel;
mysql> select sum(gaji_pokok) as "Total Gaji" from gaji;
+------------+
| Total Gaji |
+------------+
|  430500000 |
+------------+
1 row in set (0.01 sec)

AVG

mysql> select avg(gaji_pokok) as "Rata-rata Gaji" from gaji;
+----------------+
| Rata-rata Gaji |
+----------------+
|  14350000.0000 |
+----------------+
1 row in set (0.03 sec)

Min

mysql> select min(gaji_pokok) as "Gaji Terendah" from gaji;
+---------------+
| Gaji Terendah |
+---------------+
|       6100000 |
+---------------+
1 row in set (0.00 sec)

Max

mysql> select max(gaji_pokok) as "Gaji Tertinggi" from gaji;
+----------------+
| Gaji Tertinggi |
+----------------+
|       26100000 |
+----------------+
1 row in set (0.00 sec)

Adapun count digunakan untuk menghitung total record yang tersimpan dari suatu tabel, selain itu penulis juga menggunakan klausa as untuk memberi nama lain/alias pada kolom sehingga membuatnya menjadi lebih mudah untuk diidentifikasi, contohnya seperti berikut:
mysql> select count(*) from gaji;
+----------+
| count(*) |
+----------+
|       30 |
+----------+
1 row in set (0.03 sec)

mysql> select count(*) as "Total Record Tersimpan" from gaji;
+------------------------+
| Total Record Tersimpan |
+------------------------+
|                     30 |
+------------------------+
1 row in set (0.00 sec)
Lalu, bagaimana jika kita ingin mencari nilai yang lebih besar/kurang/diatas nilai maksimum/minimum/rata-rata? Agar lebih memahaminya, coba perhatikan contoh berikut terlebih dahulu:
mysql> select gaji_pokok from gaji where gaji_pokok >= avg(gaji_pokok);
ERROR 1111 (HY000): Invalid use of group function
mysql> select gaji_pokok from gaji where gaji_pokok >= max(gaji_pokok);
ERROR 1111 (HY000): Invalid use of group function
mysql> select gaji_pokok from gaji where gaji_pokok >= min(gaji_pokok);
ERROR 1111 (HY000): Invalid use of group function
Error tersebut terjadi karena pada dasarnya fungsi agregat hanya mengembalikan nilai tunggal dari satu "set" nilai, untuk itu jika ingin melakukan pencarian data dimana fungsi agregat sebagai kondisinya maka perlu menggunakan fungsi tambahan yakni dengan subquery atau klausa Group By dan Having seperti contoh berikut:

Lebih besar dari

mysql> select max(gaji_pokok) from gaji;
+-----------------+
| max(gaji_pokok) |
+-----------------+
|        26100000 |
+-----------------+
1 row in set (0.00 sec)

mysql> select dosen_id, gaji_pokok from gaji where gaji_pokok>=(select max(gaji_pokok) from gaji);
+----------+------------+
| dosen_id | gaji_pokok |
+----------+------------+
|       17 |   26100000 |
+----------+------------+
1 row in set (0.00 sec)

mysql> select dosen_id, gaji_pokok from gaji group by dosen_id having max(gaji_pokok)>=26100000;
+----------+------------+
| dosen_id | gaji_pokok |
+----------+------------+
|       17 |   26100000 |
+----------+------------+
1 row in set (0.00 sec)

Kurang dari

mysql> select min(gaji_pokok) from gaji;
+-----------------+
| min(gaji_pokok) |
+-----------------+
|         6100000 |
+-----------------+
1 row in set (0.00 sec)

mysql> select dosen_id, gaji_pokok from gaji where gaji_pokok<=(select min(gaji_pokok) from gaji);
+----------+------------+
| dosen_id | gaji_pokok |
+----------+------------+
|       27 |    6100000 |
+----------+------------+
1 row in set (0.00 sec)

mysql> select dosen_id, gaji_pokok from gaji group by dosen_id having min(gaji_pokok)<=6100000;
+----------+------------+
| dosen_id | gaji_pokok |
+----------+------------+
|       27 |    6100000 |
+----------+------------+
1 row in set (0.00 sec)

Diatas rata-rata

mysql> select dosen_id, gaji_pokok from gaji where gaji_pokok >= (select avg(gaji_pokok) from gaji);
+----------+------------+
| dosen_id | gaji_pokok |
+----------+------------+
|        8 |   15300000 |
|       10 |   18100000 |
|       11 |   18100000 |
|       12 |   19100000 |
|       13 |   20100000 |
|       14 |   22100000 |
|       15 |   25100000 |
|       16 |   23100000 |
|       17 |   26100000 |
|       18 |   22100000 |
|       19 |   18100000 |
|       20 |   17100000 |
|       21 |   15100000 |
|       30 |   18100000 |
+----------+------------+
14 rows in set (0.00 sec)

mysql> select dosen_id, gaji_pokok from gaji group by dosen_id having avg(gaji_pokok)>=14350000.000;
+----------+------------+
| dosen_id | gaji_pokok |
+----------+------------+
|        8 |   15300000 |
|       10 |   18100000 |
|       11 |   18100000 |
|       12 |   19100000 |
|       13 |   20100000 |
|       14 |   22100000 |
|       15 |   25100000 |
|       16 |   23100000 |
|       17 |   26100000 |
|       18 |   22100000 |
|       19 |   18100000 |
|       20 |   17100000 |
|       21 |   15100000 |
|       30 |   18100000 |
+----------+------------+
14 rows in set (0.00 sec)

Dari contoh diatas dapat dilihat bahwa jika kita ingin menggunakan klausa where maka kita memerlukan subquery sedangkan jika tidak ingin menggunakan where maka kita perlu menggunakan klausa having yang didahului oleh group by, untuk pemabahasan materi having lebih lengkap dapat dilihat pada materi having.
Bayu Radityo

Seorang lulusan teknik informatika yang senang dalam berbagi ilmu pengetahuan, dan membuat karya digital berupa photomanipulation dan digital drawing. instagram external-link

Posting Komentar

Lebih baru Lebih lama