Penjelasan sederhana
HAVING menyaring kelompok hasil GROUP BY berdasarkan nilai ringkasannya. Misalnya "tampilkan hanya produk yang total terjualnya minimal 5 unit".
Bedanya dengan WHERE: WHERE menyaring baris mentah sebelum dikelompokkan, sedangkan HAVING menyaring kelompok setelah dihitung. Karena itu SUM, COUNT, dan teman-temannya hanya bisa dipakai di HAVING.
Sintaks
SELECT kolom, AGREGAT(kolom)
FROM nama_tabel
GROUP BY kolom
HAVING kondisi_agregat;
| Bagian | Keterangan |
|---|---|
kondisi_agregat | Kondisi yang memakai fungsi agregat, misalnya SUM(qty) > 10. |
Tanda [kurung siku] berarti bagian opsional. Kata kunci SQL tidak membedakan huruf besar-kecil, tapi menulisnya dengan huruf besar membuat query lebih mudah dibaca.
Contoh HAVING
Data contoh: penjualan
Tabel penjualan
| id | tanggal | karyawan_id | produk | kategori | qty | harga |
|---|---|---|---|---|---|---|
| 1 | 2026-01-05 | 4 | Laptop | Elektronik | 2 | 8500000 |
| 2 | 2026-01-12 | 6 | Printer | Elektronik | 1 | 2300000 |
| 3 | 2026-01-20 | 4 | Kursi Kantor | Furnitur | 5 | 1200000 |
| 4 | 2026-02-03 | 6 | Laptop | Elektronik | 1 | 8500000 |
| 5 | 2026-02-14 | 4 | Meja Kerja | Furnitur | 3 | 1750000 |
| 6 | 2026-02-25 | 5 | Kertas A4 | ATK | 20 | 55000 |
| 7 | 2026-03-02 | 6 | Kursi Kantor | Furnitur | 4 | 1200000 |
| 8 | 2026-03-10 | 4 | Printer | Elektronik | 2 | 2300000 |
| 9 | 2026-03-18 | 5 | Kertas A4 | ATK | 30 | 55000 |
| 10 | 2026-03-27 | 6 | Monitor | Elektronik | 3 | 1900000 |
SELECT produk,
SUM(qty) AS total_unit
FROM penjualan
GROUP BY produk
HAVING SUM(qty) >= 5
ORDER BY total_unit DESC;
Hasil 2 baris
| produk | total_unit |
|---|---|
| Kertas A4 | 50 |
| Kursi Kantor | 9 |
Hanya produk yang total terjualnya minimal 5 unit.
Cara kerjanya, langkah demi langkah
FROM penjualan: 10 transaksi diambil.GROUP BY produk: transaksi dikelompokkan menurut nama produk, jadi 6 kelompok.SUM(qty)dihitung per produk: Kertas A4 50, Kursi Kantor 9, dan Laptop, Printer, Meja Kerja, Monitor masing-masing 3.HAVING SUM(qty) >= 5: hanya Kertas A4 dan Kursi Kantor yang lolos.ORDER BY total_unit DESC: diurutkan dari yang terbanyak.
Dipakai untuk apa di kantor?
- Mencari pelanggan yang belanja lebih dari 3 kali.
- Mencari kategori dengan omzet di atas target.
- Menemukan data duplikat (kelompok yang jumlahnya lebih dari 1).
Kesalahan yang sering terjadi
- Menulis
WHERE SUM(qty) >= 5. Database menolak karenaWHEREdijalankan sebelum data dikelompokkan. - Memakai
HAVINGuntuk syarat biasa sepertikota = 'Jakarta'. Bisa jalan, tapi lebih lambat. Syarat yang tidak memakai agregat sebaiknya diWHERE.
INNER JOIN