Fungsi agregat meringkas banyak baris jadi satu nilai: berapa banyak barisnya, berapa totalnya, berapa rata-ratanya, mana yang terkecil dan mana yang terbesar. Bayangin struk belanja yang panjang. Isinya banyak baris barang, tapi di bawahnya cuma ada satu baris: total. Kasir gak menulis ulang semua barang, dia meringkasnya. Itu kerja fungsi agregat.
🧪 Tebakan cepat: tabel
productspunya 5 baris.SELECT COUNT(*), MAX(price) FROM products;mengembalikan berapa baris? Tebak dulu, jawabannya ada di bagian "Banyak baris jadi satu baris".
Lima fungsi agregat
Tabel products di Lab dan latihan:
| id | name | price | category |
|---|---|---|---|
| 1 | Laptop | 12000000 | electronics |
| 2 | Mouse | 150000 | electronics |
| 3 | Notebook | 25000 | stationery |
| 4 | Monitor | 3500000 | electronics |
| 5 | Pen | 5000 | stationery |
| Fungsi | Artinya | Hasil di products |
|---|---|---|
COUNT(*) |
jumlah baris | 5 |
SUM(price) |
semua nilai dijumlah | 15680000 |
AVG(price) |
rata-rata: jumlah dibagi banyaknya | 3136000 |
MIN(price) |
nilai terkecil | 5000 |
MAX(price) |
nilai terbesar | 12000000 |
Contoh kecil lain: kalau kolom nilai berisi 80, 90 dan 70, SUM(nilai) = 240 dan AVG(nilai) = 240 / 3 = 80.
Banyak baris jadi satu baris
SELECT
COUNT(*) AS total_produk,
AVG(price) AS rata_harga,
MAX(price) AS termahal
FROM products;
| total_produk | rata_harga | termahal |
|---|---|---|
| 5 | 3136000 | 12000000 |
Satu baris, walau tabelnya 5 baris. Itu jawaban tebakannya: fungsi agregat meringkas semua baris, jadi hasilnya cuma 1 baris.
COUNT(*)menghitung baris. Tanda*di sini artinya "baris apa pun", bukan "semua kolom".AVG(price)menjumlah semuapricelalu membaginya dengan banyaknya: 15.680.000 / 5 = 3.136.000.MAX(price)mengambil harga terbesar.AS total_produkmemberi nama kolom hasilnya (disebut alias). TanpaAS, nama kolomnyaCOUNT(*), dan latihan mencaritotal_produk.- Beberapa fungsi boleh di satu
SELECT, dipisah koma.
Agregat dengan WHERE
SELECT COUNT(*) AS total_produk, AVG(price) AS rata_harga
FROM products
WHERE category = 'electronics';
| total_produk | rata_harga |
|---|---|
| 3 | 5216666.666666667 |
WHERE jalan duluan dan menyisakan 3 baris elektronik: Laptop, Mouse, Monitor. Fungsi agregat cuma meringkas baris yang lolos itu: (12.000.000 + 150.000 + 3.500.000) / 3.
NULL dilewati
NULL artinya "belum ada nilai". SUM, AVG, MIN, MAX dan COUNT(kolom) melewati NULL, sedangkan COUNT(*) tetap menghitung barisnya. Kalau ada produk keenam, Stapler, dengan price NULL:
COUNT(*)= 6, karena barisnya ada 6.COUNT(price)= 5, karena cuma 5 yang punya harga.AVG(price)tetap 3136000: NULL gak dihitung sebagai 0.
COUNT(DISTINCT category) menghitung nilai yang berbeda saja: 2 (electronics dan stationery).
💡 Beda SQLite, MySQL, dan PostgreSQL
- Pembagian bilangan bulat.
SELECT 7 / 2;di SQLite dan PostgreSQL hasilnya 3 (sisanya dibuang), di MySQL 3.5000.AVGaman di ketiganya: hasilnya selalu pecahan. - Kolom biasa di samping agregat.
SELECT name, MAX(price) FROM products;jalan di SQLite dan memberi Laptop. MySQL (5.7 ke atas, pengaturan bawaan) dan PostgreSQL menolaknya, karenanamebukan ringkasan. Untuk nama produk termahal, pakaiORDER BY price DESC LIMIT 1.
⚠️ Jebakan yang sering ketemu
- Agregat di WHERE.
SELECT name FROM products WHERE price = MAX(price);ditolak SQLite:misuse of aggregate function MAX().WHEREmemeriksa satu baris sekali jalan, sedangkanMAXbutuh semua baris. - Lupa alias. Kolomnya jadi bernama
AVG(price). Kalau soal mintarata_harga, tulisAS rata_harga. - Mengira COUNT(kolom) sama dengan COUNT(*). Bedanya muncul begitu ada NULL.
- Tabel kosong.
COUNT(*)memberi 0, tapiSUM,AVG,MIN,MAXmemberi NULL.
TL;DR: Fungsi agregat meringkas banyak baris jadi satu nilai: COUNT(*) jumlah baris, SUM total, AVG rata-rata, MIN terkecil, MAX terbesar. Tanpa GROUP BY, hasilnya 1 baris. Beri nama kolom hasil dengan AS. WHERE menyaring baris dulu, baru diringkas. NULL dilewati semua fungsi kecuali COUNT(*). Agregat gak boleh ada di WHERE.