Agregačné funkcie

V tejto kapitole budeme pokračovať s príkazom SELECT, ktorý je v podstate pri databázách v súvislosti s informačnými systémami kľúčový, keďže je akýmsi spojením informačného systému a databázy. On je cestou, ako získať z DB dáta, čo je najčastejšia operácia vykonávaná z informačných systémov. Vzhľadom k tomu ponúka jazyk SQL viacero príkazov a funkcií, ktoré je možné kombinovať s príkazom SELECT tak, aby to používateľovi, resp. vývojárovi systému, ktorý potrebuje zakomponovať SQL dotazy na databázu do kódu, uľahčilo prácu a poskytlo čo najpresnejšiu formu dát, akú potrebuje.

 

Zatiaľ vieme používať príkazy ORDER BY, WHERE a LIMIT, ale okrem nich existuje viacero tzv. agregačných funkcií (agregácia – zoskupenie, spojenie), ktoré spracúvajú vracané dáta v istej forme, resp. nám na základe nich vyhodnotia nejaký výsledok, ktorý dostaneme. Poďme ale na praktické ukážky, aby sme pochopili, o čom je reč. Aby sme videli lepší význam týchto funkcií, musíme si troška upraviť naše dáta v databáze. Pridáme si stĺpec s názvom age (vek) a náhodne upravíme hodnoty v DB tak, aby sme mali nejaké rôzne hodnoty. Mohlo by to vyzerať asi takto:


ALTER TABLE users ADD COLUMN age INT DEFAULT 18;
UPDATE users SET age=26 WHERE id=1;
UPDATE users SET age=11 WHERE id=2;
UPDATE users SET age=73 WHERE id=3;
UPDATE users SET age=15 WHERE id=5;
UPDATE users SET age=34 WHERE id=6;
UPDATE users SET age=21 WHERE id=11;
UPDATE users SET age=48 WHERE id=12;


Ako vidíte, najprv sme si pridali stĺpec do našej tabuľky s defaultnou hodnotou 18 rokov. Všimnite si dátový typ sĺtpca, aký sme použili. Typ INT (integer) je niečo podobné ako BIGINT (big integer), len má menšie rozmedzie čísiel, ktoré môže obsahovať. Pre vek nám ale ani nie je treba zbytočne veľké čísla, takže nepotrebujeme zbytočne veľký dátový typ pre tento stĺpec. Následne sme niektoré hodnoty náhodne upravili, ostatné nesú hodnotu 18.

 

Ako sme si povedali, agregačné funkie akýmsi spôsobom združujú vytiahnuté dáta dokopy a vrátia nám jeden špecifický výsledok, väčšinou sa to týka stĺpcov s číselnými dátami. Takýmto spôsobom môžeme napríklad jednoducho a rýchlo zistiť priemernú hodnotu z daných záznamov. V našom prípade takto vieme zistiť priemerný vek používateľov použitím funkcie AVG() (average – priemer). Použitie týchto funkcií je nasledovné, namiesto vymenovania stĺpcov (* alebo názov stĺpca), ktoré chceme vybrať, napíšeme funckiu a v zátvorke ako parameter uvedieme názov stĺpca, na ktorého hodnoty chceme aplikovať funkciu. Príkaz na priemerný vek by teda v našom prípade vyzeral takto:


SELECT AVG(age) FROM users;


Ako vidíte, po zavolaní tejto query dostaneme výsledok s názvom stĺpca AVG(age), čo nám špecifikuje definovanie príkazy select (vymenovanie stĺpcov/funkcie) a následne obsahuje jednu hodnotu, ktorá značí priemernú hodnotu všetkých hodnôt v danom stĺpci. Počas používania týchto funkcií môžeme tak ako aj pri iných príkazoch jednotlivé príkazy medzi sebou kombinovať. Ak by sme chceli napríklad primernú hodnotu iba prvých 5 záznamov, kľudne by sme mohli volať na konci LIMIT a výsledok by sa ako vždy rátal iba zo záznamov (riadkov), ktoré by vrátil daný príkaz select.

 

Podobne je možné použiť napríklad funkciu COUNT() (count - počet), ktorá nám vráti počet záznamov (riadkov) daného selectu. Takto by sme mohli napríklad rýchlo zistiť, ak by sme mali stĺpec pohlavie, koľko máme presne žien alebo mužov, iba by sme použili túto funkciu a vo where podmienke by bolo príslušné pohlavie. Ďalej funkciu na získanie minimálnej MIN() alebo maximálnej MAX() hodnoty alebo celkovo súčet všetkých hodnôt v danom stĺpci SUM(). Túto query si môžete spustiť naraz a prezrite si jednotlivé výsledky po jednom, aby ste videli, aký je výsledok zavolania týchto funkcií:


SELECT COUNT('*') FROM users;
SELECT COUNT(user_name) FROM users;
SELECT MIN(age) FROM users;
SELECT MAX(age) FROM users;
SELECT SUM(age) FROM users;


Posledné tri príkazy sú asi jasné, pozastavil by som sa ale nad prvými dvoma. V prvom prípade sme ako parameter funkcie COUNT použili hviezdičku, čo značí, že dostaneme počet všetkých záznamov v tabuľke, resp. daného SELECT príkazu. V druhom prípade však dostaneme číslo o jedna menšie, pretože to, že sme vyplnili namiesto hviezdičky názov konkrétneho stĺpca, zapríčiní, že dostaneme počet (count) nenulových (nie NULL) hodnôt (záznamov) v danom stĺpci.

 

Na záver tejto kapitoly si ukážeme ešte dve veci z jazyka SQL. V databázach a konkrétne v tabuľkách sa vo väčšine nachádza veľké množstvo riadkov a nie je výnimkou, že veľmi často sa niektoré riadky opakujú alebo aspoň hodnoty v nejakom stĺpci sú duplicitné (rovnaké). Niekedy však nepotrebujeme mať všetky tieto záznamy s rovnakými údajmi zvlášť, resp. mať viackrát tie isté hodnoty v nejakom stĺpci.

 

V tomto prípade môžeme použiť funkciu SELECT DISTINCT (distinct – rozdielny/jednoznačný), ktorá nám zabezpečí to, že v našom výsledku sa nebudú nachádzať žiadne rovnaké riadky, vráti nám iba rozdielne riadky alebo hodnoty. Ak by sme napríklad v našom prípade chceli dostať zoznam všetkých priezvisk, ktoré naša tabuľka obsahuje, zavolali by sme takúto query:


SELECT DISTINCT (user_surname) FROM users


Ako vidíte na výsledku, napríklad viacnásobne vyskytnuté priezvisko Harper v našej tabuľke sa nám vrátilo iba raz. Tento príkaz sa veľmi často využíva v kombinácii s funkciou COUNT, kde by sme v tomto prípade dostali rovno počet rôznych priezvisk v našej tabuľke.

Máte nejakú otázku alebo Vám niečo nie je jasné? Napíšte nám na info@zacni-programovat.sk a poradíme!

Ťažko sa vám učí samému?

Máte problémy s niektorými časťami alebo sa neviete učiť sám? Využite našu možnosť individuálnej asistencie:

  • samostatný prístup
  • vysvetlenie nejasností prebraného učiva
  • úlohy a cvičenia navyše
  • všetko z pohodlia domova cez mail a skype

Pre viac info kliknite tu

Kľúčové slová prednášky

sql agregacne funkciesql funkciesumavgpriemersumaminmaxminimummaximumsql countsql pocet riadkovselect distinct

IT ftip

Programátor je u očného. Doktor ho usadí a hovorí: - Čítajte! - T F U K M C L... Pán doktor, máte dobre nastavenú kódovú stránku?