Fungsi Agregat: COUNT, SUM, AVG, MIN, MAX
Merangkum banyak baris menjadi satu angka: menghitung jumlah, total, rata-rata, nilai terkecil dan terbesar, serta perbedaan COUNT(*), COUNT(kolom), dan COUNT(DISTINCT).
Dari banyak baris menjadi satu angka
Pemilik toko jarang bertanya "tampilkan 10.000 transaksi". Ia bertanya: "Berapa total penjualan bulan ini? Berapa rata-rata belanja pelanggan? Produk termurah berapa?" Jawabannya adalah satu angka yang merangkum banyak baris. Itulah tugas fungsi agregat.
| Fungsi | Menghasilkan | Contoh |
|---|---|---|
COUNT(*) | Jumlah baris | SELECT COUNT(*) FROM produk; → 13 |
SUM(kolom) | Total | SELECT SUM(stok) FROM produk; |
AVG(kolom) | Rata-rata | SELECT AVG(harga) FROM produk; |
MIN(kolom) | Nilai terkecil | SELECT MIN(harga) FROM produk; |
MAX(kolom) | Nilai terbesar | SELECT MAX(tgl_daftar) FROM pelanggan; |
Beberapa agregat bisa dipakai bersamaan dalam satu SELECT:
SELECT COUNT(*) AS jumlah_produk,
SUM(stok) AS total_stok,
ROUND(AVG(harga)) AS harga_rata,
MIN(harga) AS termurah,
MAX(harga) AS termahal
FROM produk
WHERE kategori_id = 1;
+---------------+------------+------------+----------+----------+
| jumlah_produk | total_stok | harga_rata | termurah | termahal |
+---------------+------------+------------+----------+----------+
| 4 | 195 | 15750 | 8000 | 22000 |
+---------------+------------+------------+----------+----------+
Perhatikan urutan kerja: WHERE menyaring baris dulu, baru agregat menghitung dari baris yang lolos. Jadi angka di atas hanya untuk Minuman.
Tiga jenis COUNT yang sering membingungkan
| Bentuk | Menghitung | Hasil di tabel pelanggan |
|---|---|---|
COUNT(*) | Semua baris | 10 |
COUNT(email) | Baris yang email-nya tidak NULL | 8 |
COUNT(DISTINCT kota) | Jumlah nilai unik (tanpa NULL) | 6 |
Agregat mengabaikan NULL! AVG, SUM, MIN, MAX, dan COUNT(kolom) melewati nilai NULL. Rata-rata dari (10, 20, NULL) adalah 15 (dua nilai), bukan 10 (tiga nilai). Waspadai ini saat menafsirkan angka. Hanya COUNT(*) yang menghitung semua baris tanpa pandang NULL.
Agregat tanpa baris sama sekali
Jika WHERE tidak meloloskan baris apa pun: COUNT menghasilkan 0, tetapi SUM, AVG, MIN, MAX menghasilkan NULL. Bungkus dengan IFNULL(SUM(...), 0) bila butuh nol.
Aturan emas: agregat tidak boleh bercampur sembarangan
SELECT nama, COUNT(*) FROM produk; tidak masuk akal: COUNT menghasilkan satu angka, sedangkan nama ada 13. Untuk mencampur kolom biasa dengan agregat, kamu butuh GROUP BY, topik bab berikutnya.