Jika Anda telah menulis query SQL selama beberapa waktu, Anda mungkin cukup familiar dengan klausa WHERE. Meskipun klausa ini tidak memiliki efek pada kolom agregat, ada cara untuk memfilter data menurut nilai agregat, yaitu dengan menggunakan klausa HAVING. Blog ini akan membahas cara kerjanya serta memberikan beberapa contoh tentang penggunaannya dalam query SELECT.
Aggregation and the HAVING Clause
Agregasi biasanya digunakan bersama dengan pengelompokan. Dalam SQL, hal itu dilakukan dengan menggunakan klausa GROUP BY. Agregasi, bersama dengan pengelompokan, memungkinkan kita untuk memperoleh insight tingkat tinggi ke dalam data kita. Misalnya, perusahaan eCommerce mungkin ingin melacak penjualan selama periode waktu tertentu.
Dalam banyak kasus, kita mungkin tidak ingin menerapkan klausa GROUP BY pada seluruh kumpulan data. Dalam kasus tersebut, kita dapat menggunakan perintah GROUP BY bersama dengan klausa HAVING bersyarat untuk menyaring hasil yang tidak diinginkan. Mirip dengan klausa WHERE, HAVING menentukan satu atau beberapa kondisi penyaringan, tetapi untuk kelompok atau agregasi. Dengan demikian, HAVING selalu ditempatkan setelah klausa WHERE dan GROUP BY tetapi sebelum klausa ORDER BY (opsional):
SELECT column_list FROM table_name WHERE where_conditions GROUP BY column_list HAVING having_conditions ORDER BY order_expression
Beberapa Contoh Praktikal
Untuk mendapatkan ide yang lebih baik tentang bagaimana HAVING bekerja, mari jalankan beberapa query SELECT terhadap Sakila Sample Database.
Query pertama kita mencantumkan penyewa film teratas, diurutkan dalam urutan menurun, sehingga orang dengan penyewaan terbanyak muncul di bagian atas. Kita akan menggunakan klausa HAVING untuk menghapus pelanggan dengan kurang dari tiga penyewaan untuk mempersingkat daftar:
SELECT c.customer_id, c.first_name, c.last_name, COUNT(r.rental_id) AS total_rentals FROM customer AS c LEFT JOIN rental AS r ON c.customer_id = r.customer_id GROUP BY c.customer_id HAVING total_rentals >= 3 ORDER BY total_rentals DESC;
Berikut adalah query dan halaman pertama dari hasil di Navicat Premium:
Dilihat dari jumlah penyewaan tersebut, kita seharusnya dapat mempersempit daftarnya secara signifikan!/p>
Memfilter Baris Dengan Baik WHERE dan HAVING
Sama seperti GROUP BY dan ORDER BY yang diterapkan pada titik yang berbeda dalam proses pencarian, demikian pula WHERE dan HAVING. Oleh karena itu, kita dapat menyertakan keduanya untuk memfilter hasil sebelum dan sesudah pengelompokan dan agregasi. Sebagai contoh, kita dapat menambahkan klausa WHERE untuk membatasi hasil pada paruh pertama tahun tertentu:
SELECT c.customer_id, c.first_name, c.last_name, COUNT(r.rental_id) AS total_rentals FROM customer AS c LEFT JOIN rental AS r ON c.customer_id = r.customer_id WHERE r.rental_date BETWEEN '2005-01-01' AND '2005-06-30' GROUP BY c.customer_id HAVING total_rentals >= 3 ORDER BY total_rentals DESC;
Sekali lagi, berikut adalah query di atas dan halaman pertama hasil di Navicat Premium:
Mengkombinasikan Beberapa Kondisi
Sama seperti klausa WHERE yang mensupport beberapa kondisi menggunakan kata kunci AND dan OR, HAVING juga demikian. Sebagai contoh, kita dapat menemukan pelanggan yang nomor sewanya berada dalam rentang tertentu dengan memodifikasi klausa HAVING menjadi seperti berikut:
HAVING total_rentals >= 3 AND total_rentals <= 10
Kesimpulan
Pada blog hari ini kita mempelajari bagaimana untuk memfilter field yang dikelompokkan dan diagregat menggunakan klausa HAVING.
Tertarik pada Navicat Premium? Anda dapat mencobanya selama 14 hari sepenuhnya gratis untuk tujuan evaluasi!