Dalam SQL, HAVING klausa dapat digunakan untuk menentukan kondisi pencarian untuk grup atau agregat.
Kode HAVING klausa biasanya digunakan dengan GROUP BY ayat. Jika tidak, ada grup gabungan tunggal implisit.
Kode HAVING klausanya mirip dengan WHERE klausa, kecuali WHERE memfilter baris individual, sedangkan HAVING kelompok filter. WHERE klausa menyaring data sebelum itu dikelompokkan, sedangkan HAVING memfilter data setelah itu dikelompokkan.
Contoh 1 – HAVING dengan COUNT()
Misalkan kita memiliki tabel berikut:
SELECT * FROM Pets; Hasil:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Kami dapat menjalankan kueri berikut terhadap tabel ini:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
HAVING COUNT(PetTypeId) > 2
ORDER BY Count DESC; Hasil:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | +-------------+---------+
Dalam hal ini, kami menggunakan HAVING klausa dalam hubungannya dengan GROUP BY klausa untuk mengembalikan hanya baris yang memiliki COUNT(PetTypeId) lebih besar dari 2 . Ini menggunakan COUNT() function, yang merupakan fungsi agregat standar SQL yang tersedia di sebagian besar RDBMS utama.
Jika kita menghilangkan HAVING klausa, kita mendapatkan satu hasil lagi:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
ORDER BY Count DESC; Hasil:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | | 1 | 1 | +-------------+---------+
Contoh 2 – HAVING dengan SUM()
Ini contoh lain. Kali ini kita menggunakan HAVING klausa dengan SUM() function, yang merupakan fungsi agregat lain yang tersedia di sebagian besar RDBMS utama (lihat SQLite SUM() untuk contoh lain).
SELECT
CountryCode,
District,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
HAVING SUM(Population) > 1000000
ORDER BY CountryCode; Hasil:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
Contoh 3 – HAVING dengan IN Operator
Anda tidak terbatas hanya pada ) Operator untuk Pemula”>lebih besar dari operator (> ) saat menggunakan HAVING ayat. Anda dapat menggunakan operator yang sama yang dapat Anda gunakan dengan WHERE klausa (seperti = , ) Operator for Beginners">< , =) Operator for Beginners">>= , IN , LIKE , dll).
Berikut adalah contoh yang menggunakan IN operator untuk menentukan rentang nilai agregat yang akan dikembalikan.
SELECT
CountryCode,
District,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
HAVING SUM(Population) IN (2022000, 3993949, 2990711)
ORDER BY CountryCode; Hasil:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Victoria | 2990711 | +---------------+-----------------+--------------+
Contoh 4 – HAVING tanpa GROUP BY Klausa
Meskipun HAVING biasanya digunakan dengan GROUP BY klausa, itu juga dapat digunakan tanpa itu. Saat digunakan tanpanya, ada grup tunggal yang teragregasi.
Hasil yang Anda peroleh mungkin bergantung pada DBMS Anda, tetapi berikut adalah contoh yang dilakukan di SQL Server.
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) > 2000000; Hasil:
+--------------+ | Population | |--------------| | 1429559884 | +--------------+
Contoh ini hanya mengembalikan populasi agregat semua kota dalam tabel.
Inilah yang terjadi jika kita menukar operator yang lebih besar dari (> ) dengan operator kurang dari (< ).
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) < 2000000; Hasil:
(0 rows affected)