Windows - A HAVING kulcsszó használata SELECT utasításban

2. rész

forráskód letöltése
Előző részben elkezdtük az SQL szerver SELECT utasítását taglalni, és foglalkoztunk a GROUP BY csoportosító formulával. Most ennek kiterjesztéseként a HAVING kulcsszót tekintjük át, ami a csoportok szűrésére használható.
HAVING jelentése
Szorosan a GROUP BY funkcióhoz kapcsolódik a HAVING kulcsszó használata. Segítségével a GROUP BY által előállított csoportokra képezhetünk keresési feltételt. Ha elhagyjuk a GROUP BY paramétert, akkor WHERE feltételként viselkedik. GROUP BY ALL használatakor a HAVING hatálytalanítja az ALL kulcsszót. Nem használhatunk text, ntext és image típust a keresési feltételben. A CUBE operátor által generált csoportosító sorokra pedig nincsen hatással.
A HAVING feltételt úgy használjuk a GROUP BY mellett, mint ahogy a WHERE feltételt a SELECT utasításban. A WHERE feltételt a csoportosító utasítás előtt használjuk, a HAVING feltételt pedig utána. Szintaxisa hasonlít a WHERE feltételhez, de ez a feltétel annyival több, hogy használhatunk összegző függvényeket. A HAVING feltétel hivatkozhat bármely tagra, ami a select listában szerepel.
Néhány keresési feltétel alkalmazható a csoportképzés előtt is és után is, viszont érdemesebb a WHERE feltételben megadni, ugyanis így csökkenthető a csoportosításhoz használt sorok száma. Az SQL szerver lekérdezés optimalizáló felismeri, ha a HAVING feltételben használt keresés alkalmazható a csoportképzés előtt. Ebben az esetben a lekérdezés futtatásakor ott használja. Ezt nem minden esetben képes értelmezni, tehát javasolt, hogy amit lehet még a WHERE feltételben adjunk meg.
A WHERE, GROUP BY és HAVING funkciói összefoglalva:
  • A WHERE feltételt a FROM által szolgáltatott adatok szűrésére használjuk
  • A GROUP BY feltételt a WHERE által kapott output eredmények csoportosítására használjuk
  • A HAVING kulcsszó segítségével csoportosított sorok között szűrhetünk.
HAVING szintaktika
[ HAVING < keresési_feltétel > ]
Példák
Példáinkban az SQL szerveren megtalálható Northwind adatbázist használjuk.
Vásárlók száma csoportosítva régió szerint az USA-ban, csak a 2-nél több vásárlók csoportjaira szűrve.
SELECT Region, COUNT(*) AS [Customers Count]
FROM Customers
WHERE Country = 'USA'
GROUP BY Region
HAVING COUNT(*) > 2
Vásárlók országok szerint csoportosítva csak a 2-nél több vásárló/ország csoportokra szűrve, és vásárlók száma szerinti sorban.
SELECT Country
FROM Customers 
GROUP BY Country
HAVING COUNT(*) > 2
ORDER BY COUNT(*)
A HAVING keresési feltételében használhatunk olyan állításokat, amelyek kiértékelődése TRUE, FALSE, vagy UNKNOWN. Pl.: BEETWEEN, CONTAINS, EXISTS, LIKE IS [NOT] NULL, IN.
Az alábbiakban az előző példa átalakítva, a 3 és 5 közötti vásárló/ország csoportokra szűrünk.
SELECT Country
FROM Customers 
GROUP BY Country
HAVING COUNT(*) BETWEEN 3 AND 5
ORDER BY COUNT(*)
Az előző példa átalakítva, és az "U" betűvel kezdődő országok szerepelnek csak.
SELECT Country
FROM Customers 
GROUP BY Country
HAVING Country LIKE 'U%'
ORDER BY COUNT(*)

A Transact-SQL SELECT utasítás cikksorozat