Databázové systémy I Přednáška č. 5 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Obsah – Logické operátory Opakování – Souhrnné dotazy – Skupinové dotazy Databázové systémy 1 - př. 5 2
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ř. 5 3
Pravdivostní tabulka AND Operand 1Operand 2Výsledek AND ANO NE ANONE ANONULL NENULLNE NULLANONULL NE NULL Databázové systémy 1 - př. 5 4
Pravdivostní tabulka OR Operand 1Operand 2Výsledek AND ANO NEANO NEANO NE ANONULLANO NENULL ANO NULLNENULL Databázové systémy 1 - př. 5 5
Pravdivostní tabulka NOT Operand 1Výsledek AND ANONE ANO NULL Databázové systémy 1 - př. 5 6
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ř. 5 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ř. 5 8
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ř. 5 9
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ř. 5 10
Agregační funkce – syntaxe SELECT 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 !!! A_OBCHOD SCHÉMA Databázové systémy 1 - př. 5 11
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ř. 5 12
Agregační funkce – syntaxe SELECT 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í. A_OBCHOD SCHÉMA Databázové systémy 1 - př. 5 13
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ř. 5 14
Skupinové dotazy – syntaxe SELECT SELECT,,..., FROM WHERE GROUP BY,,... ; 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ř. 5 15
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ř. 5 16
Omezení výsledků skupinových dotazů SELECT,,..., FROM WHERE GROUP BY,,... HAVING ; 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ř. 5 17
Omezení výsledků skupinových dotazů 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; A_OBCHOD SCHÉMA Databázové systémy 1 - př. 5 18
Postup provádění skupinových dotazů 1)spojení tabulek (dle zadaných podmínek spojení) JOIN 2)Aplikace omezujících podmínek za klauzulí WHERE 3)Seskupení řádků do skupin (dle atributů uvedených za klauzulí) GROUP BY 4)Výpočet agregačních funkcí SUM, COUNT, MAX, MIN, AVG nad skupinami řádků – pro každou skupinu vznikne jediný řádek 5)Aplikace omezujících podmínek za klauzulí HAVING 6)Seřazení výsledku dle klauzule ORDER BY Databázové systémy 1 - př. 5 19
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ř. 5 20
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ř. 5 21
Pozvánka na příště Pohledy Základy vytváření jednoduchých i komplexních pohledů. Seznámení se základní syntaxí příkazu pro vytvoření pohledu, s pravidly pro provádění DML operací nad pohledy a s použitím in-line pohledů. Vnořené dotazy Práce s vnořenými dotazy. Popisuje rozdíl mezi korelovanými a nekorelovanými vnořenými dotazy a zobrazuje jejich použití. Množinové operátory Problematika množinových operátorů a práce s množinovými operátory v jazyce SQL. Seznámení s operátory UNION ALL, UNION, MINUS a INTERSECT. Databázové systémy 1 - př. 5 22