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)