SQL aggregálás, csoportosítás és összekapcsolás Adatbázisok 1
Sor- és oszlopfüggvények SQL lekérdezésekben többféle függvényt használhatunk sorfüggvények: bemenő paramétere(i) a reláció egy-egy sorának egy vagy több mezőértéke oszlopfüggvények: bemenő paraméter egy oszlop vagy oszlopokat használó kifejezés értékei Sorfüggvény például: UPPER, TO_CHAR stb. A legfontosabb oszlopfüggvények MIN MAX COUNT AVG SUM
Oszlopfüggvények Az oszlopfüggvényeket nevezik még aggregáló, csoportosító és összesítő függvényeknek is. Csak a SELECT vagy HAVING záradékokban szerepelhetnek azaz a WHERE záradékban nem fordulhatnak elő!
Példák SELECT COUNT(nev) FROM szeret; SELECT COUNT(DISTINCT nev) FROM szeret; SELECT COUNT(*) FROM szeret; SELECT MAX(datum), MIN(datum) FROM csatak; SELECT osztaly FROM hajoosztalyok WHERE vizkiszoritas = (SELECT MAX(vizkiszoritas) FROM hajoosztalyok);
Maximum és minimum keresés SELECT * FROM (SELECT osztaly, vizkiszoritas FROM hajoosztalyok ORDER BY vizkiszoritas DESC) WHERE ROWNUM = 1; A lekérdezés O(n*log(n)) időben fut le. Ha több maximum is létezik, csak egyet ad vissza.
Egy lassabb megoldás SELECT osztaly, vizkiszoritas FROM hajoosztalyok WHERE vizkiszoritas >= ALL (SELECT vizkiszoritas FROM hajoosztalyok); Ha több maximum is létezik, a lekérdezés mindegyiket visszaadja. Viszont O(n 2 ) időben fut.
Egy jobb megoldás SELECT osztaly, vizkiszoritas FROM hajoosztalyok WHERE vizkiszoritas = (SELECT MAX(vizkiszoritas) FROM hajoosztalyok); Lineáris időben fut. Az összes maximum értéket visszaadja.
Csoportosítás Sok gyakorlati alkalmazás esetében hasznos, ha az adatokból (sorokból) csoportokat képezhetünk, s ezekre számolhatunk aggregált értékeket. Például előfordulhat, hogy nem azt szeretnénk tudni, hogy hány hajó vett részt a csatákban összesen, hanem inkább arra vagyunk kíváncsiak, hogy egy-egy csatában hány hajó küzdött egymással. Az ilyen lekérdezések megfogalmazását teszi lehetővé a GROUP BY záradék.
Példa csoportosításra SELECT csata, COUNT(hajo) AS db FROM kimenetelek GROUP BY csata; csatahajo GuadalcanalSouth Dakota GuadalcanalKirishima GuadalcanalWashington North CapeDuke of York North CapeScharnhorst
GROUP BY több attribútummal SELECT csata, osztaly, COUNT(nev) AS db FROM kimenetelek, hajok WHERE hajo = nev GROUP BY csata, osztaly; Először a csata attribútum értékei szerint csoportosítunk, majd ezeken a csoportokon belül az osztály attribútum értékei szerint további csoportok képződnek.
Fontos szintaktikai megszorítás Ha a SELECT záradékban csoportosító függvény is szerepel, akkor csak azok az attribútumok jelenhetnek meg "szabadon", amelyek a GROUP BY záradékban is meg lettek adva. Szabadon, azaz nem egy csoportosító függvény paramétereként.
Példák SELECT osztaly, MAX(vizkiszoritas) FROM hajoosztalyok; SELECT csata, hajo,COUNT(hajo) FROM kimenetelek GROUP BY csata;
HAVING záradék Csoportokra vonatkozó, összesítő függvényt használó feltételt a HAVING záradékban adhatunk meg. SELECT nev FROM szeret GROUP BY nev HAVING COUNT(*) = 2;
Újabb szintaktikai szabály Hasonlóan a SELECT záradékhoz, egy attribútum csak akkor szerepelhet szabadon a HAVING záradékban, ha a GROUP BY részben is megjelenik.
Példák SELECT nev FROM szeret GROUP BY nev HAVING COUNT(*) = 2 AND nev LIKE '%A%'; SELECT nev FROM szeret GROUP BY nev HAVING COUNT(*) = 2 AND gyumolcs LIKE '%A%'; SELECT nev FROM szeret GROUP BY nev WHERE gyumolcs LIKE '%A%' HAVING COUNT(*) = 2;
Összekapcsolások SELECT * FROM hajok JOIN kimenetelek ON nev = csata; SELECT * FROM hajok LEFT JOIN kimenetelek ON nev = csata; SELECT * FROM hajok RIGHT JOIN kimenetelek ON nev = csata; SELECT * FROM hajok FULL OUTER JOIN kimenetelek ON nev = csata; SELECT * FROM hajok NATURAL JOIN hajoosztalyok;
Feladatok I. 1.Hány különböző hajó és csata szerepel a Kimenetelek táblában? 2.Mely hajóosztályoknál magasabb az ágyúk száma, mint az átlag? 3.Melyik a legkorábbi csata? 4.Mely hajók maradtak épek a legkorábbi csatában? 5.Melyik a második legkorábbi csata? 6.A legkevesebb gyümölcsöt szeretők közül kinek a neve szerepel legelöl az ABC-ben? 7.Hajóosztályonként adjuk meg, hogy az egyes osztályokhoz hány hajó tartozik.
Feladatok II. 8.Melyik évben avatták fel a legtöbb hajót? 9.Melyik az az ország, melynek a legtöbb hajója süllyedt el? 10.Melyek azok a csaták, amelyekben legalább három hajó részt vett? 11.Csatánként adjuk meg azt a legkorábbi évszámot, amikor a csatában részt vett hajók közül legalább egyet felavattak! 12.Melyik hajót avatták fel ötödik legkorábban? 13.Kik szeretnek minden gyümölcsöt? 14.Mely hajók nem vettek részt egy csatában sem? 15.Országonként adjuk a hajók számát és az elsüllyed hajók számát.