Perintah HAVING
๐ Pengenalan Perintah HAVING
Perintah HAVING digunakan untuk memfilter hasil dari fungsi agregat. HAVING ditambahkan setelah GROUP BY, sedangkan WHERE digunakan sebelum GROUP BY. HAVING mirip dengan WHERE, tetapi HAVING dapat digunakan dengan fungsi agregat.
Sintaks HAVING
Sintaks untuk HAVING adalah:
SELECT kolom1, fungsi_agregat(kolom2) FROM nama_tabel WHERE kondisi GROUP BY kolom1 HAVING kondisi_agregat ORDER BY kolom1;
Perbedaan antara WHERE dan HAVING
Perbedaan utama antara WHERE dan HAVING adalah:
- WHERE memfilter baris sebelum pengelompokkan
- HAVING memfilter grup setelah pengelompokkan
- WHERE tidak dapat digunakan dengan fungsi agregat
- HAVING dapat digunakan dengan fungsi agregat
Contoh Tabel
Misalkan kita memiliki tabel 'pesanan' dengan data berikut:
| id | pelanggan_id | produk | jumlah | tanggal |
|---|---|---|---|---|
| 101 | 1 | Laptop | 15000000 | 2023-01-15 |
| 102 | 2 | Mouse | 250000 | 2023-01-20 |
| 103 | 1 | Keyboard | 750000 | 2023-02-05 |
| 104 | 3 | Laptop | 12000000 | 2023-02-10 |
| 105 | 2 | Monitor | 3000000 | 2023-02-15 |
Contoh HAVING
Untuk menampilkan pelanggan yang memiliki total belanja lebih dari 10.000.000:
SELECT pelanggan_id, SUM(jumlah) AS total_belanja FROM pesanan GROUP BY pelanggan_id HAVING SUM(jumlah) > 10000000;
Hasilnya akan menjadi:
| pelanggan_id | total_belanja |
|---|---|
| 1 | 15750000 |
| 3 | 12000000 |
HAVING dengan JOIN
Anda dapat menggabungkan HAVING dengan JOIN:
SELECT p.nama, COUNT(pe.id) AS jumlah_pesanan, SUM(pe.jumlah) AS total_belanja FROM pelanggan AS p INNER JOIN pesanan AS pe ON p.id = pe.pelanggan_id GROUP BY p.id, p.nama HAVING COUNT(pe.id) > 1;
HAVING dengan Beberapa Kondisi
Anda dapat menggunakan beberapa kondisi dalam HAVING:
SELECT pelanggan_id, COUNT(id) AS jumlah_pesanan, SUM(jumlah) AS total_belanja FROM pesanan GROUP BY pelanggan_id HAVING COUNT(id) > 1 AND SUM(jumlah) > 5000000;
HAVING dengan WHERE
Anda dapat menggabungkan HAVING dengan WHERE:
SELECT pelanggan_id, COUNT(id) AS jumlah_pesanan, SUM(jumlah) AS total_belanja FROM pesanan WHERE tanggal >= '2023-02-01' GROUP BY pelanggan_id HAVING SUM(jumlah) > 5000000;
HAVING dengan ORDER BY
Anda dapat mengurutkan hasil dari HAVING:
SELECT pelanggan_id, COUNT(id) AS jumlah_pesanan, SUM(jumlah) AS total_belanja FROM pesanan GROUP BY pelanggan_id HAVING SUM(jumlah) > 5000000 ORDER BY total_belanja DESC;
HAVING dengan Berbagai Fungsi Agregat
Anda dapat menggunakan berbagai fungsi agregat dalam HAVING:
-- Pelanggan dengan jumlah pesanan lebih dari 1 SELECT pelanggan_id, COUNT(id) AS jumlah_pesanan FROM pesanan GROUP BY pelanggan_id HAVING COUNT(id) > 1; -- Pelanggan dengan total belanja lebih dari 10.000.000 SELECT pelanggan_id, SUM(jumlah) AS total_belanja FROM pesanan GROUP BY pelanggan_id HAVING SUM(jumlah) > 10000000; -- Pelanggan dengan rata-rata belanja lebih dari 5.000.000 SELECT pelanggan_id, AVG(jumlah) AS rata_rata_belanja FROM pesanan GROUP BY pelanggan_id HAVING AVG(jumlah) > 5000000; -- Pelanggan dengan belanja minimum lebih dari 1.000.000 SELECT pelanggan_id, MIN(jumlah) AS belanja_minimum FROM pesanan GROUP BY pelanggan_id HAVING MIN(jumlah) > 1000000;
HAVING dengan Ekspresi
Anda dapat menggunakan ekspresi dalam HAVING:
-- Pelanggan dengan total belanja di antara 5.000.000 dan 15.000.000
SELECT pelanggan_id, SUM(jumlah) AS total_belanja
FROM pesanan
GROUP BY pelanggan_id
HAVING SUM(jumlah) BETWEEN 5000000 AND 15000000;
-- Pelanggan dengan total belanja lebih dari rata-rata total belanja semua pelanggan
SELECT pelanggan_id, SUM(jumlah) AS total_belanja
FROM pesanan
GROUP BY pelanggan_id
HAVING SUM(jumlah) > (SELECT AVG(total_belanja) FROM (
SELECT pelanggan_id, SUM(jumlah) AS total_belanja
FROM pesanan
GROUP BY pelanggan_id
) AS rata_rata);
HAVING dengan Alias
Beberapa sistem database memungkinkan Anda menggunakan alias dalam HAVING:
SELECT pelanggan_id, SUM(jumlah) AS total_belanja FROM pesanan GROUP BY pelanggan_id HAVING total_belanja > 10000000;
Catatan: Tidak semua sistem database mendukung penggunaan alias dalam HAVING. Jika tidak didukung, Anda harus mengulangi fungsi agregat.
Coba Sendiri
Anda dapat mencoba kode SQL di atas di editor berikut:
๐ก Tips Perintah HAVING
Saat menulis query dengan GROUP BY dan HAVING, ingat urutan eksekusi: FROM โ WHERE โ GROUP BY โ HAVING โ SELECT โ ORDER BY. Ini membantu Anda memahami kapan setiap klausa dievaluasi dan mengapa WHERE tidak dapat digunakan dengan fungsi agregat.