Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

SQL Agregace a funkce Databázové systémy. Agregační funkce SUM( ) - součet numerických hodnot ve sloupci MIN( ) - minimální hodnota ve sloupci MAX( )

Podobné prezentace


Prezentace na téma: "SQL Agregace a funkce Databázové systémy. Agregační funkce SUM( ) - součet numerických hodnot ve sloupci MIN( ) - minimální hodnota ve sloupci MAX( )"— Transkript prezentace:

1 SQL Agregace a funkce Databázové systémy

2 Agregační funkce SUM( ) - součet numerických hodnot ve sloupci MIN( ) - minimální hodnota ve sloupci MAX( ) - maximální hodnota ve sloupci COUNT( ) - počet numerických hodnot ve sloupci AVG( ) - aritmetický průměr numerických hodnot ve sloupci Vnořování uvedených funkcí do sebe, např. MIN(SUM()), není ve většině implementací SQL povoleno.

3 Agregace – seskupování Agregaci si lze představit jako shluknutí několika řádků do jednoho. Pro tuto "skupinu" řádků můžeme pomocí agregačních funkcí používat různé matematické operace. K tomu je zapotřebí rozšířit příkaz SELECT o části GROUP BY případně HAVING. Syntax příkazu SELECT : SELECT seznam sloupců FROM seznam tabulek [WHERE podmínky] [GROUP BY výrazy pro seskupení] [HAVING podmínka pro skupiny]

4 Seskupení řádků – GROUP BY Seskupení se provádí podle hodnot určitých sloupců. Seskupovat můžeme podle hodnot libovolného počnu sloupců. Seskupení spočívá v tom, že když se objeví dva řádky, jejichž hodnoty se ve vybraných sloupcích shodují, databázový systém na ně bude pohlížet jako na jeden řádek (na ostatní sloupce musíme aplikovat agregační funkce, které vrátí jednu hodnotu pro daný souhrnný řádek). Příklad: Mějme tabulku ZAPIS, která bude obsahovat data: id_st id_pr S1 P1 S2 P1 S2 P2 S3 P2 S3P3 Pokud provedeme seskupení podle sloupce id_st, výsledek po seskupení bude mít pouze tři řádky.

5 a) - bez aplikace agregační funkce Ve druhem sloupci by se objevili první z nalezených hodnot odpovídajících prvnímu sloupci: SELECT id_st,id_prid_stid_pr FROM zapis S1P1 GROUP BY id_st; S2P1 Výsledek:S1 P1 S2P2 S2 P1 S3P2 S3 P2 S3P3 SELECT id_pr,id_st id_prid_st FROM zapis P1S1 GROUP BY id_pr; P1S2 Výsledek: P1S1 P2S2 P2S2 P2S3 P3S3

6 b) - s aplikací agregační funkce Použitím funkce, která by sečetla počet záznamů odpovídajících prvnímu sloupci, bychom dostali tabulku : SELECT id_st,COUNT(*) id_stid_pr FROM zapisS1P11 GROUP BY id_st; S2P12 Výsledek:S1 1S2P2 S2 2S3P22 S3 2S3P3 SELECT id_pr, COUNT(*) id_prid_st FROM zapisP1S12 GROUP BY id_pr;P1S2 Výsledek: P12P2S22 P22P2S3 P31P3S31

7 Součet záznamů - COUNT( ) COUNT(*) je nejzákladnější agregační funkcí, která slouží jenom k získání počtu záznamů v rámci jedné skupiny agregovaných řádků. Zajímá-li nás kolik předmětů studuje každý ze studentů: SELECT s.jmeno, s.prijmeni, COUNT(*) pocet_pr FROM zapis z, student s WHERE z.id_st=s.id_st GROUP BY s.id_st; Takovýto výpis není ale pravdivý. Chceme-li získat kompletní výpis, použijeme k tomu např. levé vnější spojení tabulek: SELECT s.jmeno,s.prijmeni,COUNT(jz.id_pr) pocet_pr FROM student s LEFT JOIN zapis z ON z.id_st=s.id_st GROUP BY s.id_st;

8 SUM(sloupec) Agregační funkce SUM( ) vrátí součet hodnot v uvedeném sloupci v rámci shluknuté skupiny záznamů. Pokud bychom chtěli součet poplatků všech studentů na daném oboru, napsali bychom následující příkaz: AVG(sloupec) Funkce AVG( ) počítá aritmetický průměr z vybraných hodnot zadaného sloupce. Chceme-li zjistit průměr st. výsledků studentů na oborech: SELECT obor, SUM(poplatek) FROM student GROUP BY obor; SELECT obor, AVG(st_prumer) FROM student GROUP BY obor;

9 MIN(sloupec) Agregační funkce MIN( ) slouží pro vrácení minima z hodnot ve sloupci ze seskupených záznamů. Chceme-li zjistit nejlepší studijní výsledky studentů v ročníku: MAX(sloupec) Funkce MAX( ) vrací maximum z hodnot zadaného sloupce. Příklad vypíše seznam nakladatelství, a pro každé z nich bude uvedeno kolik stojí jejich nejdražší výtisk. Chceme-li zjistit nejhorší studijní výsledky studentů v ročníku: SELECT rocnik, MIN(st_prumer) FROM student GROUP BY rocnik; SELECT rocnik, MAX(st_prumer) FROM student GROUP BY rocnik;

10 Na výstup dostaneme všechny skupiny agregovaných záznamů, ale někdy potřebujeme v rámci takových záznamů vybrat jen ty záznamy, které ještě dále budou splňovat další podmínky. Dodatečnou restrikci zapisujeme v části HAVING: Chceme seznam všech studentů, kteří mají zapsaný více než jeden předmět. Přehled vypište ve formě jméno a příjmení studenta následované počtem předmětů, na které je zapsán: Další použití agregačních funkcí SELECT s.jmeno, s.prijmeni,COUNT(*) pocet_pr FROM zapis z, student s WHERE z.id_st=s.id_st GROUP BY s.id_st HAVING count(*) >1;

11 Chceme-li výpis setřídit podle hodnoty agregační funkce, za klíčové slovo ORDER BY uvedeme agregační funkci: Třídění dle výsledků agregační funkce SELECT obor, AVG(st_prumer) FROM student GROUP BY obor ORDER BY AVG(st_prumer); Některé databázové systémy mají však omezení, v takovém případě použijeme modifikátor AS: SELECT obor, AVG(st_prumer) AS prumer FROM student GROUP BY obor ORDER BY prumer;

12 Pokud výchozí tabulka obsahuje úplná data a nehodláme rozlišovat jednotlivé řádky: Agregace bez klíče SELECT COUNT(s1),SUM(s1),AVG(s1),MIN(s1),MAX(s1) FROM Tabulka; vznikne tabulka obsahující právě jeden řádek s hodnotami agregačních funkcí. Po řadě obsahuje hodnotu počtu platných hodnot s1, součtu, aritmetického průměru, minimální a maximální hodnotu. Při agregaci se není nutné omezovat jen na jeden sloupec. Agregační funkce je možné použít na jakýkoli výraz odkazující se na libovolný počet sloupců původní tabulky, např. SELECT COUNT(s2*s3) POCET, SUM(s2*s3) SOUCET FROM Tabulka;

13 Chceme-li použít jeden sloupec tabulky jako klíč ke shlukování řádků do agregátů, stačí uvést klíčové slovo GROUP BY a za ním název agregačního sloupce. Pro pochopení dotazu s agregací je třeba si uvědomit pořadí kroků, které provádí SQL server po obdržení dotazu: TABULKA => RESTRIKCE => AGREGACE => TŘÍDĚNÍ => PROJEKCE V SQL je rozpor mezi pořadím v syntaxi a pořadím provádění jednotlivých kroků. Toto naštěstí mate pouze uživatele, ale ne SQL server. Ten zkontroluje syntaxi příkazu, a pak zvolí optimální pořadí kroků. Agregace s jednoduchým klíčem

14 Chceme-li použít více sloupců tabulky jako klíč ke shlukování řádků do agregátů, stačí uvést za klíčové slovo GROUP BY názvy příslušných sloupců oddělené čárkou. Nejde o nic jiného než o popis složeného klíče pro agregaci. Pokud nás zajímá jaké jsou minimální studijní průměry na jednotlivých oborech podle ročníků, stačí napsat příkaz: Agregace se složeným klíčem SELECT obor, rocnik,MIN(st_prumer) FROM student GROUP BY obor,rocnik ORDER BY obor,rocnik

15 Dvě základní skupiny funkcí: Skalární funkce, které se většinou aplikují na jeden argument (pole) a vrací opět jednu hodnotu (pole). Agregační funkce, jejichž vstupem jsou množiny řádků (záznamů) a z nich je počítána výsledná hodnota. Funkce můžeme volat ve všech SQL příkazech, zejména pak v dotazech. Chceme-li nějakou funkci použít, musíme dotaz upravit tak, aby bylo jasné, na které sloupce bude použita: V názvech funkcí se nerozlišují velká a malá písmena. Mezi názvem funkce a následující závorkou nesmí být mezera! Práce s funkcemi SELECT FUNKCE(sloupec) FROM Tabulka;

16 CONCAT(x, y,…) - zřetězení dvou nebo více řetězců (sloupců) do jednoho: Textové funkce - práce s řetězci SELECT CONCAT(prijmeni," ",jmeno) AS cele_jmeno FROM student; SELECT prijmeni,jmeno,obor FROM student ORDER BY length(obor); V některých systémech se používá možnost zřetězení použitím znaménka „+“ (např. prijmeni+" "+jmeno). LENGTH(sloupec) - vrací délku řetězce; (v některých systémech se můžeme setkat s názvem LEN ). Výpis seznamu studentů a oborů, na kterých studují, seřazený podle délky oboru:

17 LEFT(sloupec, x) / RIGHT(sloupec, x) - vrací x znaků umístěných úplně vlevo/vpravo v hodnotě uložené ve vybraném sloupci. Výpis prvních dvou znaků rodného čísla : Textové funkce - práce s řetězci SELECT prijmeni, jmeno, LEFT(rod_cislo,2) FROM student; SUBSTRING(sloupec, počátek, délka) - funkce vracející nějaký podřetězec, nejtypičtější jejich použití je se třemi parametry. Výpis z každého rodného čísla den narozeni (pátý až šestý znak): SELECT prijmeni,jmeno,SUBSTRING(rod_cislo,5,2) FROM student; SELECT upper(prijmeni), jmeno FROM student; UPPER(sloupec) /LOWER(sloupec) - převedení řetězce na velká/malá písmena.

18 Základní funkce pro práci s čísly: ABS(X) – vrací absolutní hodnota z čísla X, SIN(X) - vrací sinus úhlu X(zadaného v radiánech), COS(X) - vrací kosinus úhlu X, TAN(X) - vrací tangens úhlu X, COT(X) - vrací kotangens úhlu X, EXP(X) - vrací e na X-tou, POWER(X,Y) - vrací X na Y-tou, SELECT POWER(2,3); LN(X) – vrací přirozený logaritmus čísla X – stejné jako LOG(X) SELECT LN(2); LOG(B,X) – vrací logaritmus čísla X pří základu B – existují i LOG2(X), LOG10(X) SELECT LOG(2,65536);SELECT LOG(10,100); Číselné funkce

19 MOD(X,Y) – vrací zbytek z podílu X/Y RAND(X,Y) – vrací náhodné číslo (0, 1) Výpis výsledků v náhodném pořadí: SELECT * FROM tabulka ORDER BY RAND(); SIGN(X) - vrací hodnotu určující, zda je číslo kladné (1), záporné (- 1), nebo nula (0) SQRT(X) – vypočítá druhou odmocninu čísla X, FORMAT(X, Y) - vrací číslo X formátované jako číslo s Y desetinnými místy. Jako oddělovač je použitá“,“. SELECT CONCAT(FORMAT(poplatek,2),” Kč”) FROM student; PI( ) – vrací hodnotu konstanty „pi“, ROUND(X,Y) - vrací číslo X zaokrouhlené Y desetinných míst SELECT ROUND(1.864,1);→ 1.9 Číselné funkce

20 CEILING(X) – vrací nejvyšší celé číslo založené na hodnotě čísla X (tzn. zaokrouhlení na celé číslo nahoru) SELECT CEILING(1.864); → 2 FLOOR(X) – vrací celočíselnou část čísla X (tzn. zaokrouhlení na celé číslo dolu) SELECT FLOOR(1.864); → 1 TRUNCATE(X,Y) – vrací číslo X oříznuté na Y desetinných míst. Jestliže Y je 0, pak výsledek nemá desetinnou část. Y může být i záporné. SELECT TRUNCATE(1. 864,1); → 1.8 SELECT TRUNCATE(122,-2); → 100 Číselné funkce

21 Základní funkce pro práci datumem a časem: NOW( ) – vrací aktuální datum a čas, CURDATE( ) – vrací aktuální datum, CURTIME( ) – vrací aktuální čas, HOUR(sloupec) – vrací z uložené hodnoty pouze údaj o hodině, MINUTE(sloupec) – vrací z uložené hodnoty pouze údaj o minutě, SECOND(sloupec) – vrací z uložené hodnoty pouze údaj o sekundě, DAYNAME(sloupec) – vrací z uložené hodnoty pouze název dne, DAYOFMONTH(sloupec) – vrací z uložené hodnoty pouze údaj o dnu v měsíci, MONTH(sloupec) – vrací z uložené hodnoty pouze údaj o měsíci, MONTHNAME(sloupec) – vrací z uložené hodnoty pouze název měsíce, YEAR(sloupec) – vrací z uložené hodnoty pouze údaj o roku, Funkce pro práci s datumem a časem

22 ADDDATE(sloupec, INTERVAL x typ) – vrací hodnotu sloupce zvýšenou o x jednotek - jako typ se může použít SECOND, MINUTE, HOUR, DAY, MONTH, YEAR (nebo je kombinovat) Např. přidejte k datumu zápisu studenta 36 měsíců: ADDDATE(datum_zapisu, INTERVAL 36 MONTH); - nebo DATE_ADD() SELECT DATE_ADD('2004-01-01 00:00:00',INTERVAL '-1 10' DAY_HOUR); SUBDATE(sloupec, INTERVAL x typ) – vrací hodnotu sloupce sníženou o x jednotek (DATE_SUB()) DATEDIFF(datum1,datum2) – vrací počet dnů mezi dvěma datumy. Počítá se pouze s datumem. SELECT DATEDIFF('2004-12-31 23:59:59','2004-12-30'); SELECT DATEDIFF(NOW(),'2005-01-01'); Funkce pro práci s datumem a časem

23 DATE_FORMAT(sloupec, ‘formátovací_řetězec‘) – vrací naformátovaný datum a čas. TIME_FORMAT(sloupec, ‘formátovací řetězec‘) – vrací naformátovaný čas Formátovací_řetězec může obsahovat libovolnou kombinaci formátovacích kódů a znaků procenta: Funkce pro práci s datumem a časem %eden v měsíci%Mnázev měsíce anglický%Hdvoumíst. hodina- 24 h %ddvoumístný den%bzkrácený název měsíce%iminuty %Dden s příponou%Yrok%Ssekundy %Wnázev dne v týdnu%ydvoumístní rok%rčas %azkrácený název dne%Ihodina%Tčas ve 24h formátu %cčíslo měsíce%hdvoumístná hodina%pAM nebo PM %mdvojmost. číslo měsíce%khodina ve 24 h SELECT DATE_FORMAT(datum_zapisu,"%a %e %M %Y") AS datum, prijmeni, jmeno FROM student ORDER BYdatum_zapisu.

24 GET_FORMAT(datový_typ, ‘formátovací konstanta‘) – vrací ‘formátovací řetězec‘. - datový_typ může být pouze: : DATE, TIME, DATETIME a TIMESTAMP - ‘formátovací konstanta‘: 'EUR', 'USA', 'JIS', 'ISO', and 'INTERNAL'. Např. GET_FORMAT(DATE,'EUR')'%d.%m.%Y' SELECT DATE_FORMAT('2003-10-03 ', GET_FORMAT(DATE,'EUR')); EXTRACT(sloupec, INTERVAL x typ) – vrací hodnotu vyextrahovanou z datumu. SELECT EXTRACT(YEAR FROM '2005-07-02'); → 2005 SELECT EXTRACT(YEAR_MONTH FROM NOW()); Funkce pro práci s datumem a časem

25 Obecně se jedná o převodní funkce z některých typů na číslo nebo řetězec. MySQL automaticky mění čísla na řetězce (a naopak). SELECT 1+'1'; → 2 Chceme-li změnit číslo na řetězec explicitně, můžeme použít funkce CAST() anebo CONCAT(): SELECT 38.8, CAST(38.8 AS CHAR); → 38.8, '38.8‚ SELECT 38.8, CONCAT(38.8); → 38.8, '38.8' CONV(N,z_báze,do_báze) – mění čísla s různou bázi (základem). SELECT CONV('a',16,2); → '1010' Pro změnu řetězce na datum se používá funkce: STR_TO_DATE(řetězec, formát) – vrací datum ve specifikovaném formátu SELECT STR_TO_DATE('2003-10-31', '%d.%m.%Y'); Konverzní funkce


Stáhnout ppt "SQL Agregace a funkce Databázové systémy. Agregační funkce SUM( ) - součet numerických hodnot ve sloupci MIN( ) - minimální hodnota ve sloupci MAX( )"

Podobné prezentace


Reklamy Google