Szűrés összesítő függvények eredményére
SELECT `nev`, AVG(`jegy`) FROM `jegy`
JOIN `tantargy` ON `jegy`.`targy_id` = `tantargy`.`id`
GROUP BY `tantargy`.`nev`
WHERE AVG(`jegy`) > 4.5
Ez a lekérdezés azonban több ponton is hibás! Egyrészt, a WHERE kulcsszónak a GROUP BY előtt kell lennie, másrészt, nem használható a WHERE arra, hogy összesítés eredményére szűrjünk. Ebben az esetben ugyanis a HAVING kulcsszót kell használnunk. A lekérdezés javítva tehát:
SELECT `nev`, AVG(`jegy`) FROM `jegy`
JOIN `tantargy` ON `jegy`.`targy_id` = `tantargy`.`id`
GROUP BY `tantargy`.`nev`
HAVING AVG(`jegy`) > 4.5
Szeretnél az ünnepek alatt is gyakorolni? Vár az Easter Bug Hunt játékunk! Csatlakozz, és keresd meg az összes hibát - akár még jutalom is ütheti a markod!
Irány a játékWHERE vagy HAVING?
Egyes kifejezésekben akár egyszerre is szerepelhet a WHERE és a HAVING. Összesítést is tartalmazó lekérdezésekben a WHERE szűrőkulcsszót használjuk akkor, ha az összesítés ELŐTTI adatokat szeretnénk szűrni, a HAVING kifejezést pedig akkor, ha az összesítés által kiszámolt végeredmény alapján szeretnénk szűrni az adatainkat.
Ha például szeretnénk megszámolni, hogy a nevezo tábla hány olyan diákot tartalmaz, aki emelt kategóriába nevezett, akkor a WHERE-t kell használnunk, hiszen először szeretnénk szűrni, majd a szűrés eredményéül kapott sorokat szeretnénk megszámolni:
SELECT COUNT(*) FROM `nevezo` WHERE `kategoria` = "emelt"
Ha viszont azokat az iskolákat keressük, akik legalább 3 főt neveztek be emelt szinten a versenyre, akkor utóbbi feltételt már a HAVING kulcsszóval tudjuk felvenni, ez ugyanis már az összesítés végeredményére vonatkozik:
SELECT `iskola`, COUNT(*) AS "nevezők" FROM `nevezo`
WHERE `kategoria` = "emelt"
GROUP BY `iskola`
HAVING COUNT(*) >= 3
Segíthet a megfelelő kifejezés kiválasztásában, ha átgondoljuk a végrehajtás sorrendjét:
- Leszűrjük az adatokat a WHERE kulcsszó használatával (ha van)
- Csoportosítjuk a már leszűrt adatokat a GROUP BY használatával (ha van)
- Összesítjük a csoportokat az összesítő függvényekkel (ha vannak)
- Összesítés után a keletkezett eredményeket ismét leszűrjük a HAVING kulcsszóval (ha van)