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:

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.