11. Az eredmények csoportosítása - GROUP BY

A lekérdezés eredményét csoportosíthatjuk és a csoportok között is tovább is válogathatunk a GROUP BY és HAVING alparancsokkal.

SELECT mezők FROM tábla
[WHERE feltétel] 
GROUP BY mező   
[HAVING csoport_feltétel];

A GROUP BY alparancs után megadott oszlop értékei alapján az addig megtalált sorokat csoportosítja az adatbázis-kezelő, és a megfelelő csoportokból egy kerül az eredménybe.

A csoportokra vonatkozólag használhatunk függvényeket, amelyek a csoportokra vonakozó értékeket számolhatnak ki.

Csoportosító függvények

COUNT (mező) – A megadott mező értékei alapján a csoport számának megszámlálása

COUNT (*) – A csoportokba tartozó sorok számának megjelenítésem

MAX (mező) – A sorok közötti maximum megkeresése

MIN (mező) – A sorok közül a minimális érték megkeresése

SUM (mező) – Az összeg kiszámolása

A legegyszerűbb lekérdezések esetén, ha a SELECT után csak egy összegző függvény van, akkor nem kell GROUP BY-t használni.

Például az iskola tanulóinak száma:

SELECT COUNT(*) FROM Diakok

Az eredmény egy szám lesz, amitt egy kicsit cizellálhatunk egy ALIAS névvel (azaz becenévvel).

SELECT COUNT(*) AS Összeg FROM Diakok

Ebben az esetben az eredmény az lesz, hogy: Összeg   598.

Matematika osztályzatok száma és átlaga:

SELECT COUNT (*)', AVG(Osztalyzat) AS atlag FROM Osztalyzatok
WHERE Tantargy = 'matematika';

A lekérdezésekben az mezőnevek és a csoportokra vonatkozó függvények mellett az attributumok aritmetikai kifejezéseit is használhatjuk. A kifejezésekben az alapműveletek használhatók, illetve zárójelek a műveletek végrehajtási sorrendjének módosítására. A karakteres adatok összefűzésére a || operátor használható.

Osztályzatok kiírása fordítva, vagyis az egyes a legjobb:

SELECT DID, 6 - Osztályzat FROM Osztalyzatok;

A függvények argumentuma előtt megadható a DISTINCT vagy ALL módosító. DISTINCT esetén csak a különböző értékek, ALL esetén minden érték részt vesz a számításban. Az alapértelmezés az ALL. A definiálatlan, NULL értékek nem szerepelnek a számításban.

GROUP BY kötelező használata

Ha a SELECT lekérdezésben csoportosító függvényen kívül szerepel más mező vagy érték is, akkor a GROUP BY alparancsot kötelező használni és annak a mezőnek a nevét kell használni, ami nem tartalmazza a csoportosító függvényt!

Az alábbi lekérdezésben az osztályok nevét és a bennük lévő tanulók számát jelenítjük meg.

SELECT Osztály, COUNT(*) AS Darab
FROM Diakok
GROUP BY Osztaly

Az iskolában hány darab 1,2,3,4,5 osztályzat van?

SELECT Osztályzat, COUNT(*) AS Darab
FROM Osztalyzatok
GROUP BY Osztalyzat
ORDER BY Osztalyzat

HAVING használata

A HAVING utasítással a SELECT ... FROM... WHERE... GROUP BY ... ORDER BY... által adott eredményeket tudjuk tovább szűkíteni.

Ha az ötnél nagyobb létszámú osztályokra vagyunk kíváncsiak, akkor szűrni kell a fenti lekérdezés adatait a HAVING utasítással.

SELECT Osztály, COUNT (*) AS Darab
FROM Diakok
GROUP BY Osztaly 
HAVING COUNT (*) > 5

Példák

Tanulónak van ténylegesen osztályzata ebben az évben?

Nem biztos, hogy minden tanuló kapott osztályzatot. Nekünk csak azok kellenek, akik kaptak osztályzatot és nem az összes diák. Nyilvánvalóan az osztályzatok táblából kell kiindulni, de mivel egy diák többször is kapott osztályzatot, ezért először elő kell állítani az osztályzatot kapott tanulók listáját (amiben minden tnauló egyszer szerepel), és utána megszámolni ennek a listának a sorainak a számát.

SELECT Count(*) AS db
FROM ( SELECT DISTINCT DID FROM osztalyzatok) B