Fungsi Agregasi dalam Basis Data Relasional

Kriteria menggunakan klausa HAVING atau WHERE, manakah yang lebih baik kinerjanya?

M. Ramadhan
Telematika
4 min readMar 12, 2023

--

Daftar Isi

Pendahuluan
Fungsi Agregasi
Klausa GROUP BY
Klausa HAVING
Klausa HAVING versus Klausa WHERE
Penutup
Referensi

Photo by Shahadat Rahman on Unsplash

Pendahuluan

Fungsi agregasi dalam basis data digunakan untuk menghitung atau memproses nilai-nilai numerik dalam suatu kumpulan data atau tabel. Fungsi agregasi ini dapat digunakan untuk menghitung total data (sum), rata-rata (average), nilai terkecil (minimum), nilai terbesar (maximum), dan lain sebagainya.

Fungsi agregasi sering digunakan dalam operasi query pada basis data untuk menghasilkan ringkasan data yang berguna. Misalnya, Anda dapat menggunakan fungsi agregasi untuk menghitung total penjualan bulanan, rata-rata penjualan per bulan, nilai maksimum atau minimum dari penjualan bulanan, dan sebagainya. Fungsi agregasi juga dapat digunakan untuk mengelompokkan data dan menghitung nilai agregasi untuk setiap kelompok.

Beberapa contoh fungsi agregasi yang sering digunakan dalam basis data adalah COUNT, SUM, AVG, MAX, MIN, STDDEV, VAR. Fungsi-fungsi ini tersedia di hampir semua sistem manajemen basis data (DBMS ‘Database Management System’) dan dapat digunakan dalam berbagai jenis query, baik itu query sederhana maupun query yang lebih kompleks.

Fungsi Agregasi

Berikut adalah contoh penggunaan fungsi COUNT().

Fungsi COUNT() digunakan untuk menghitung jumlah baris atau data yang ada dalam sebuah tabel. Fungsi COUNT() mengambil satu argumen, yaitu sebuah ekspresi atau kolom yang ingin dihitung jumlahnya. Fungsi ini mengembalikan sebuah nilai numerik yang menunjukkan jumlah baris atau data yang ada dalam ekspresi atau kolom yang ditentukan.

Fungsi COUNT() sangat berguna dalam berbagai jenis operasi query, seperti mencari jumlah total data, menemukan jumlah data yang unik, dan menghitung jumlah data dalam kelompok tertentu. Contoh penggunaan fungsi COUNT() dalam query adalah sebagai berikut.

  • Menghitung jumlah baris dalam sebuah tabel. Misalnya, menghitung jumlah pegawai.
SELECT COUNT(*)
FROM Pegawai;
  • Menghitung jumlah data yang berisi dalam sebuah kolom. Misalnya, menghitung jumlah pegawai yang telah memiliki tanggal lahir.
SELECT COUNT(TglLahir)
FROM Pegawai;
  • Menghitung jumlah data yang unik dalam sebuah kolom, misalnya, menghitung jumlah golongan darah yang ada.
SELECT COUNT(DISTINCT GolDarah)
FROM Pegawai;
  • Menghitung jumlah data dalam kelompok tertentu. Contoh, menghitung jumlah pegawai untuk setiap golongan.
SELECT Golongan, COUNT(*)
FROM Pegawai
GROUP BY Golongan;

Dalam kasuss di atas, fungsi COUNT() membantu kita untuk mendapatkan informasi yang berguna tentang data dalam sebuah tabel atau hasil dari sebuah query.

Fungsi agregasi selengkapnya yang ada dalam MS SQL Sever disajikan dalam Tabel 1.

Tabel 1 Fungsi Agregasi

Klausa GROUP BY

Digunakan untuk mengelompokkan baris. Misalnya menghitung jumlah pegawai, rata-rata gaji, total gaji untuk setiap kelompok golongan pegawai.

SELECT Golongan, 
Count(*) As Jumlah,
Avg(Gaji) As Rata2Gaji,
Sum(Gaji) As TotalGaji
FROM Pegawai
GROUP BY Golongan

Query di atas menghasilkan empat kolom dengan jumlah baris sesuai dengan jumlah golongan yang ada.

Berikut contoh lainnya.

SELECT Golongan, GolDarah,
Count(*) As Jumlah,
Avg(Gaji) As Rata2Gaji,
Sum(Gaji) As TotalGaji
FROM Pegawai
GROUP BY Golongan, GolDarah,

Query ini menghasilkan lima kolom dengan jumlah baris sesuai dengan jumlah kombinasi golongan dengan golongan darah. Jadi, kalau ada 17 golongan dan 4 golongan darah, akan menghasilkan 17 x 4 = 68 baris. Bila ada pegawai yang golongan darahnya tidak diketahui, maka akan dihasilkan 17 x 5 = 85 baris.

Klausa HAVING

Bagaimana kalau kita ingin mengetahui gaji rata-rata dan total gaji setiap kelompok golongan pegawai, tetapi dibatasi untuk golongan yang gaji rata-rata > 5000000? Apakah boleh menggunakan klausa WHERE?

SELECT Golongan,
Avg(Gaji) As Rata2Gaji,
Sum(Gaji) As TotalGaji
FROM Pegawai
WHERE Avg(Gaji) > 5000000
GROUP BY Golongan

Bila dieksekusi, query di atas memberikan pesan kesalahan berikut.

Msg 147, Level 15, State 1, Line 5
An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.

Query tersebut meminta data berdasarkan kriteria Avg(gaji) yang belum diketahui dan justru akan dihitung. Sebagai gantinya, gunakan klausa HAVING.

SELECT Golongan,
Avg(Gaji) As Rata2Gaji,
Sum(Gaji) As TotalGaji
FROM Pegawai
GROUP BY Golongan
HAVING Avg(Gaji) > 5000000

Query menghasilkan jumlah baris sesuai dengan jumlah golongan yang ada. Dengan HAVING, jumlah baris yang ditampilkan sesuai dengan kriteria yang diberikan.

Klausa HAVING versus Klausa WHERE

Bagaimana dengan kasus berikut?

SELECT Golongan,
Avg(Gaji) As Rata2Gaji,
Sum(Gaji) As TotalGaji
FROM Pegawai
GROUP BY Golongan
HAVING Golongan In (1,3,4)

Karena kriterianya tidak menggunakan fungsi agregasi, maka boleh diganti dengan klausa WHERE.

SELECT Golongan,
Avg(Gaji) As Rata2Gaji,
Sum(Gaji) As TotalGaji
FROM Pegawai
WHERE Golongan In (1,3,4)
GROUP BY Golongan

Manakah yang lebih baik kinerjanya? Bila ada tujuh belas golongan, pada klausa HAVING, rata-rata dan total gaji akan dihitung sebanyak tujuh belas kali. Yang ditampilkan hanya tiga golongan sesuai dengan kriterianya. Pada klausa WHERE, data disaring dulu baru dihitung yaitu hanya tiga golongan. Yang lebih bagus kinerjanya adalah yang menggunakan WHERE karena yang dihitung lebih sedikit.

Penutup

Fungsi agregasi bekerja berdasarkan nilai numerik dari sekumpulan baris untuk satu waktu. Kriteria penyaringan data berdasarkan fungsi agregasi menggunakan klausa HAVING. Bila kriterianya tidak menggunakan fungsi agregasi, sebaiknya menggunakan klausa WHERE karena kinerjanya lebih baik.

--

--

M. Ramadhan
Telematika

I’m a database designer and developer, childhood in Menggala, living in Palembang.