Sorgu sırasında GROUP BY ifadesiyle veri grupları oluşturulduğunda, ortaya çıkan sonuçlara daha fazla filtre uygulanabilir. WHERE deyiminin FROM tarafından döndürülen satırlarda bir filtre işlevi gördüğü gibi, HAVING ifadesi de gruplar üzerinde filtre işlevi görmektedir. Bu bölümde HAVING ifadesinin nasıl yazıldığını ve HAVING ile WHERE arasındaki farkı anlayacağız.

Gruplandırılmış Verileri Filtrelemek

Bir SELECT ifadesinde aynı anda WHERE ve GROUP BY kullanıldıysa, mantıksal sorgu işlemenin dördüncü aşaması da HAVING ifadesidir:

Mantıksal İşlem SırasıAşamaAçıklama
5SELECT
1FROM
2WHERESatırlar üzerinde işlem yapar
3GROUP BYVeri grupları oluşturur
4HAVINGVeri grupları üzerinde işlem yapar
6ORDER BY

HAVING ifadesinde, kavramsal olarak WHERE ifadesindeki gibi bir predicate oluşturulur ve sonra da GROUP BY tarafından döndürülen her gruba predicate ile filtre uygulanır.

TSQL veri tabanında çalışan aşağıdaki sorguda, tüm siparişler müşteriye göre gruplandırır ve yalnızca sipariş vermiş olan müşteri kayıtları döndürülür. HAVING ifadesi kullanılmadığı burada gruplara filtre uygulanmayacaktır:

SELECT custid, COUNT(*) AS count_orders
FROM Sales.Orders
GROUP BY custid;

Aşağıdaki iletiye sahip grupları döndürür:

 (89 row(s) affected) 

Aşağıdaki sorgu ise, önceki sorguya HAVING ifadesinin eklenmiş halidir. Tüm siparişleri müşteriye göre gruplandırır, daha sonra yalnızca 10 veya daha fazla sipariş vermiş olanlar müşteri kayıtlarını döndürülür:

SELECT custid, COUNT(*) AS count_orders
FROM Sales.Orders
GROUP BY custid
HAVING COUNT(*) >= 10; 

Aşağıdaki iletiye sahip grupları döndürür:

(28 row(s) affected)

Not: HAVING ifadesi, SELECT ifadesinden önce işlenir, bu nedenle SELECT ifadesinde oluşturulan sütun takma adları HAVING tarafından kullanılamaz.

HAVING ve WHERE Karşılaştırması

Hem HAVING hem de WHERE ifadeleriyle verilere filtreleme işlemi uygulanabilir. FROM tarafından döndürülen satırlara WHERE ile filtreleme işlemi uygulanır. Eğer sorguda WHERE ifadesini takiben GROUP BY … HAVING bölümü varsa, gruplama işlemi başlamadan WHERE ifadesi önce çalışarak kayıtlar filtrelenir.

HAVING ifadesi ise GROUP BY çalıştıktan sonra, yani gruplandırılmış veriler üzerinde çalışır. Özetlemek gerekirse:

  • WHERE ifadesi, sorgunun sonraki aşamalarında kullanılacak kayıtları ayarlar.
  • HAVING ifadesi, sorgunun sonraki aşamalarında kullanılacak kayıt gruplarını ayarlar.

Not: WHERE ve HAVING işlemleri ayrık değildir, birbirini dışlamaz.

Kaynak:
HAVING (Transact-SQL)