Fájlok írása Pytonban!
Elkészült a Python nyelv Szövegfájlok írása tananyagunk! Jó tanulást, jó gyakorlást!

<info9>

Szűrés összesítő függvények eredményére

Ügyelj a törtekre!
A MySQL, a legtöbb programnyelvhez hasonlóan, tizedespontot használ! Ügyeljünk a törtek megfelelő formátumára.
Az előző fejezetben áttekintettük, hogy miként tudunk adatokat csoportosítani, majd az adatcsoportokat összesíteni különféle összesítő függvényekkel. Előfordulhat azonban olyan eset is, amikor az összesítő függvények eredményére szeretnénk szűrni. Keressük például azokat a tantárgyakat, amikből a diákok átlaga legalább 4,5. Az eddigi tudásunk alapján feltételezhetjük, hogy erre használhatjuk az alábbi lekérdezést:
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
Itt a húsvét!

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ék

WHERE 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:

  1. Leszűrjük az adatokat a WHERE kulcsszó használatával (ha van)
  2. Csoportosítjuk a már leszűrt adatokat a GROUP BY használatával (ha van)
  3. Összesítjük a csoportokat az összesítő függvényekkel (ha vannak)
  4. Összesítés után a keletkezett eredményeket ismét leszűrjük a HAVING kulcsszóval (ha van)