Databázové systémy I Přednáška 7 Databázové systémy 1 – KIT/IDAS1 Ing. Monika Borkovcová, Ph.D.
Databázové systémy 1 - př. 7 Obsah Logické operátory Opakování Souhrnné dotazy Skupinové dotazy Databázové systémy 1 - př. 7
Databázové systémy 1 - př. 7 Logické operátory AND a zároveň (vrací ANO, pokud oba operandy jsou zároveň ANO) OR nebo (vrací ANO, pokud alespoň jeden operand je ANO) NOT není pravda, že (vrací ANO, když následující operand je NE) Databázové systémy 1 - př. 7
Pravdivostní tabulka AND Operand 1 Operand 2 Výsledek AND ANO NE NULL Databázové systémy 1 - př. 7
Pravdivostní tabulka OR Operand 1 Operand 2 Výsledek AND ANO NE NULL Databázové systémy 1 - př. 7
Pravdivostní tabulka NOT Operand 1 Výsledek AND ANO NE NULL Databázové systémy 1 - př. 7
Databázové systémy 1 - př. 7 Agregační funkce aritmetický průměr AVG ([DISTINCT] [ALL] výraz) počet hodnot COUNT ([DISTINCT] [ALL] výraz) maximum MAX (výraz) minimum MIN (výraz) součet hodnot SUM ([DISTINCT] [ALL] výraz) Databázové systémy 1 - př. 7
Databázové systémy 1 - př. 7 Souhrnné dotazy Velice často nás nezajímají jednotlivé detaily uložené v konkrétních řádcích v jednotlivých tabulkách, ale několik málo souhrnných informací, které sumarizují obsah databáze, například: Kolik zaměstnanců má společnost ? Jaké jsou tržby pobočky ? Kolik lidí jede průměrně v jednom vlaku ? Jaká je průměrná délka života ? Jaká je průměrná mzda ? Kolik vstupenek se prodalo na všechna utkání ? Jaká je nejvyšší a nejnižší vyplácená sociální dálka ? Kdo získal nejméně bodů z testu ? Databázové systémy 1 - př. 7
Databázové systémy 1 - př. 7 Agregační funkce Agregační funkce pracují nad množinou řádků, přičemž vrací právě jeden výsledek pro celou vstupní množinu dat. Tyto funkce pomocí matematických a statistických operací zpracovávají agregované hodnoty z celých sloupců (není-li uvedeno jinak v podmínce). AVG ([DISTINCT] [ALL] výraz) aritmetický průměr COUNT ([DISTINCT] [ALL] výraz) počet hodnot MAX (výraz) maximum MIN (výraz) minimum SUM ([DISTINCT] [ALL] výraz) součet hodnot Databázové systémy 1 - př. 7
Agregační funkce a datové typy Data ve výrazech zpracovávaných funkcemi SUM() a AVG() musí být numerického typu, funkce pro hledání extrémních hodnot MIN() a MAX() mohou pracovat nad sloupci a výrazy v numerickém formátu, řetězci či ve formátu datum/čas. Při použití funkcí MIN() a MAX() nad řetězcovými daty je třeba si uvědomit, že porovnání dvou řetězců je závislé na použité znakové sadě. Ačkoli standard SQL2 obsahuje podporu pro národní znakové sady a alternativní posloupnosti řazení, implementace těchto vlastností se však mezi jednotlivými databázovými systémy liší. Databázové systémy 1 - př. 7
Agregační funkce – syntaxe SELECT A_OBCHOD SCHÉMA Příklady: SELECT AVG(cena) FROM produkty; průměrná hodnota ve sloupci cena v tabulce produkty, počítají se jen z uvedených hodnot – tj. NOT NULL SELECT MIN(cena) FROM produkty WHERE oznaceni LIKE ‘L%’; minimální (uvedená) hodnota ve sloupci cena v tabulce produkty pro řádky splňující danou podmínku SELECT count(cena) FROM produkty WHERE cena >= 25000; počet uvedených hodnot ve sloupci cena v tabulce produkty pro řádky splňující danou podmínku SELECT count(*) FROM produkty; počet řádků tabulky produkty Agregační funkce tedy ignorují hodnoty NULL !!! Databázové systémy 1 - př. 7
Agregační funkce – syntaxe SELECT Příklad: SELECT SUM(skutecne_trzby)-SUM(plan_trzby), SUM(skutecne_trzby-plan_trzby) FROM obchodni_vysledky; Pozor na skutečnost, že výsledkem tohoto dotazu mohou být za jistých okolností 2 různé hodnoty! Rozdíl nastane v okamžiku, kdy v některém řádku bude scházet například vyplněná hodnota skutecne_trzby (bude tedy null), ale plánovaná tržba bude uvedena. Zatímco plánovaná tržba ovlivní výsledek SUM(plan_trzby), tak hodnota SUM (skutecne_trzby-plan_trzby) ovlivněna nebude. Volba správného dotazu záleží na tom, jaký výsledek požadujeme a zda dokážeme potřebu správně naformulovat do SQL dotazu. Databázové systémy 1 - př. 7
Agregační funkce – syntaxe SELECT A_OBCHOD SCHÉMA Použitím klíčového slova DISTINCT můžeme eliminovat započtení duplicitních hodnot ve sloupcové funkci. SELECT count(DISTINCT mesto) FROM pobocky; Podívejme se na rozdíl výsledku tohoto dotazu s výsledky dotazu následujícího SELECT count(mesto) FROM pobocky; První dotaz s klíčovým slovem DISTINCT zjistí počet rozdílných NOT NULL hodnot ve sloupci mesto, druhý dotaz počet NOT NULL hodnot ve sloupci mesto. Výsledkem jsou tedy obecně úplně různé informace. Volba dotazu opět záleží na zadání a jeho přesném pochopení. Databázové systémy 1 - př. 7
Databázové systémy 1 - př. 7 Skupinové dotazy Na rozdíl od souhrnných dotazů dochází k výpočtu agregačních funkcí pro konkrétní skupiny řádků. Nevzniká tedy na výstupu jeden jediný řádek, ale řádky pro jednotlivé skupiny. Kolik zaměstnanců mají jednotlivá oddělení společnosti ? Jaké jsou tržby poboček společnosti ? Kolik lidí jede průměrně v jednom vlaku na dané trase ? Jaká je průměrná délka života pro muže a ženy ? Jaká je průměrná mzda v různých sektorech ? Kolik vstupenek se prodalo na jednotlivá utkání ? Jaká je nejvyšší a nejnižší vyplácená sociální dálka v krajích ? Kdo získal nejméně bodů z testu v daném předmětu ? Databázové systémy 1 - př. 7
Skupinové dotazy – syntaxe SELECT SELECT <sloupec_1>, <sloupec_2>, ... <sloupec_n>, <agregační_funkce (výraz)> FROM <seznam tabulek> WHERE <podmínky> GROUP BY <sloupec_1>, <sloupec_2>, ... <sloupec_n>; V předchozích příkladech jsme vyhodnocovali hodnoty v celých sloupcích, nyní budeme vytvářet mezisoučty, které budou vztahovat k jednotlivým skupinám. Pod pojmem skupina můžeme chápat konkrétní pobočku společnosti, studovaný předmět, město, osobu, … Všechny sloupce, které nejsou agregovány a jsou uvedeny za klíčovým slovem SELECT (definují skupiny, pro něž dochází k výpočtu agregačních funkcí) musí být uvedeny i za klauzulí GROUP BY. Databázové systémy 1 - př. 7
Skupinové dotazy – syntaxe SELECT Příklad: SELECT dodavatel_id, AVG(cena) FROM produkty GROUP BY dodavatel_id; Databázový systém nejdříve rozdělí produkty do skupin podle DODAVATEL_ID, pro každého dodavatele jedna skupina. V rámci každé skupiny mají všechny produkty stejnou hodnotu DODAVATEL_ID. Pro každou skupinu pak vypočte požadované agregační funkce. Dotazy obsahující klauzuli GROUP BY označujeme jako skupinové dotazy, neboť seskupují data ze zdrojových tabulek do skupin a pro každou z těchto skupin vytváří jediný souhrnný řádek. Sloupce uváděné za klauzulí GROUP BY označujeme jako seskupující sloupce. Databázové systémy 1 - př. 7
Omezení výsledků skupinových dotazů SELECT <sloupec_1>, <sloupec_2>, ... <sloupec_n>, <agregační_funkce (výraz)> FROM <seznam tabulek> WHERE <podmínky> GROUP BY <sloupec_1>, <sloupec_2>, ... <sloupec_n> HAVING <podmínky pro agregované výsledky>; Ve výsledku budou pouze ty agregované řádky, které splňují podmínky uvedené za klauzulí HAVING. Omezení uvedená za klauzulí HAVING se aplikují až po vytvoření skupin, tedy před zobrazením (případně seřazením) výsledku. Databázové systémy 1 - př. 7
Omezení výsledků skupinových dotazů A_OBCHOD SCHÉMA Příklady: SELECT dodavatel_id, AVG(cena) FROM produkty GROUP BY dodavatel_id HAVING AVG(cena) >=33000; SELECT nazev, AVG(cena) FROM dodavatele JOIN produkty ON dodavatele.dodavatel_id = produkty.dodavatel_id GROUP BY nazev HAVING AVG(cena) >=33000; Databázové systémy 1 - př. 7
Postup provádění skupinových dotazů spojení tabulek (dle zadaných podmínek spojení) JOIN Aplikace omezujících podmínek za klauzulí WHERE Seskupení řádků do skupin (dle atributů uvedených za klauzulí) GROUP BY Výpočet agregačních funkcí SUM, COUNT, MAX, MIN, AVG nad skupinami řádků – pro každou skupinu vznikne jediný řádek Aplikace omezujících podmínek za klauzulí HAVING Seřazení výsledku dle klauzule ORDER BY Databázové systémy 1 - př. 7
Databázové systémy 1 - př. 7 Příklad SELECT nazev, AVG(cena) prum_cena, count(*) pocet_produktu FROM A_OBCHOD.dodavatele JOIN A_OBCHOD.produkty ON dodavatele.dodavatel_id = produkty.dodavatel_id WHERE oznaceni not like 'A2500H' and nazev like 'ASUS' GROUP BY nazev HAVING count(cena)>0 ORDER BY nazev; Databázové systémy 1 - př. 7
Databázové systémy 1 - př. 7 Shrnutí • Agregační funkce slouží k výpočtu součtu, průměru, minimální a maximální hodnoty nebo k určení počtu hodnot ve sloupci nebo ve výsledku dotazu. • Souhrnný dotaz neobsahuje klauzuli GROUP BY a generuje jediný řádek výsledku dotazu. • Skupinové dotazy obsahují klauzuli GROUP BY a generují řádky na výstup dotazu pro každou kombinaci atributů uvedených za klauzulí GROUP BY. • Klauzule HAVING vykonává obdobnou funkci jako klauzule WHERE. Zatímco klauzule WHERE se aplikuje na řádky vstupující do zpracování, klauzule HAVING se aplikuje až na agregované hodnoty v již seskupených řádcích. Databázové systémy 1 - př. 7
Databázové systémy 1 - př. 7 Prostor pro dotazy Děkuji za pozornost http://www.iconfinder.com/icondetails/40094/128/database_storage_icon Databázové systémy 1 - př. 7