Praktické ukázky použití SQL. Informační a znalostní systémy

Podobné dokumenty
SQL SQL-SELECT. Informační a znalostní systémy. Informační a znalostní systémy SQL- SELECT

Úvod do databázových systémů

KIV/ZIS cvičení 5. Tomáš Potužák

B0M33BDT Technologie pro velká data. Supercvičení SQL, Python, Linux

Informační systémy ve zdravotnictví. 10. cvičení

Návrh databázového modelu

Úvod do databázových systémů 3. cvičení

Operátory ROLLUP a CUBE

6. blok část B Vnořené dotazy

6. blok část C Množinové operátory

Informační systémy 2008/2009. Radim Farana. Obsah. Dotazy přes více tabulek

Databázové systémy. Cvičení 6: SQL

Základní přehled SQL příkazů

4. blok část A Logické operátory

KIV/ZIS cvičení 6. Tomáš Potužák

Jaký je rozdíl v definicicíh VARCHAR2(20 BYTE) a VARCHAR2(20 CHAR):

KIV/ZIS - SELECT, opakování

MS Access Dotazy SQL

Úvod do databázových systémů

Co bude výsledkem mého SELECTu? RNDr. David Gešvindr MVP: Data Platform MCSE: Data Platform MCSD: Windows Store MCT

Databázové systémy Cvičení 5.3

Databáze SQL SELECT. David Hoksza

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Databázové systémy a SQL

Úvod do databázových systémů

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Úvod do databází. Modelování v řízení. Ing. Petr Kalčev

XMW4 / IW4 Pokročilé SELECT dotazy. Štefan Pataky

Jazyk SQL 2. Michal Valenta. Katedra softwarového inženýrství FIT České vysoké učení technické v Praze c M.Valenta, 2011 BI-DBS, ZS 2011/12

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

Dotazovací jazyky I. Datová krychle. Soběslav Benda

Databázové systémy I

Databázové systémy. Datová integrita + základy relační algebry. 4.přednáška

12. blok Pokročilé konstrukce SQL dotazů - část II

Databázový systém označuje soubor programových prostředků, které umožňují přístup k datům uloženým v databázi.

8.2 Používání a tvorba databází

RNDr. Jakub Lokoč, Ph.D. RNDr. Michal Kopecký, Ph.D. Katedra softwarového inženýrství Matematicko-Fyzikální fakulta Univerzita Karlova v Praze

Databázové systémy. Dotazovací jazyk SQL - II

Informační systémy ve zdravotnictví. 8. cvičení

DB1 cvičení 4 spojení tabulek a složitější dotazy

Úvod do databázových systémů

5. blok Souhrnné a skupinové dotazy

Jazyk SQL 1. Michal Valenta. Katedra softwarového inženýrství FIT České vysoké učení technické v Praze c Michal Valenta, 2012 BI-DBS, ZS 2011/12

PG 9.5 novinky ve vývoji aplikací

Dotazy tvorba nových polí (vypočítané pole)

U koly na procvic ení jazyka T-SQL

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá:

Databázové systémy Cvičení 5

Návrh a tvorba WWW stránek 1/14. PHP a databáze

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace.

Databázové systémy. * relační kalkuly. Tomáš Skopal. - relační model

Informační systémy ve zdravotnictví. 6. cvičení

Analýza a modelování dat 6. přednáška. Helena Palovská

GEOGRAFICKÉ INFORMAČNÍ SYSTÉMY CVIČENÍ 4

Databáze 2011/2012 SQL SELECT II. RNDr.David Hoksza, Ph.D.

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Použití dynamických parametrů prostředí SET_ENV_ v MarushkaDesignu

Databáze I. Přednáška 6

Reporting. Ukazatele je možno definovat nad libovolnou tabulkou Helios Orange, která je zapsána v nadstavbě firmy SAPERTA v souboru tabulek:

Slučování tabulek. Sloučení dvou tabulek

Databáze. Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu. Bedřich Košata

Kontingenční tabulky v MS Excel 2010

DJ2 rekurze v SQL. slajdy k přednášce NDBI001. Jaroslav Pokorný

Řešené příklady STUDENT(RČ, JMÉNO, SPECIALIZACE) PŘEDMĚT(KÓD, NÁZEV, SYLLABUS, GARANT) ZÁPIS(RČ, KÓD, SEMESTR, ZNÁMKA)

Jazyk SQL databáze SQLite. připravil ing. petr polách

Databázové systémy a SQL

Dolování v objektových datech. Ivana Rudolfová

Osnova je orientační pro FIT, u FEKTu se dá předpokládat, že budou zohledněny předchozí znalosti studentů, kde většina s databází nikdy přímo

Microsoft Office. Excel vyhledávací funkce

Obsah. Kapitola 1. Kapitola 2. Kapitola 3. Kapitola 4. Úvod 11. Stručný úvod do relačních databází 13. Platforma 10g 23

Databázové systémy Cvičení 5.2

Algoritmizace a programování

Úvod do databázových systémů

Databáze pro evidenci výrobků

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

Dotaz se souhrny a dotaz křížový

Ukládání a vyhledávání XML dat

Databázové systémy I

Sada 1 - PHP. 15. Výběr dat z databáze. Příkaz SELECT

PA152. Implementace databázových systémů

ANOTACE vytvořených/inovovaných materiálů

Marketingová komunikace. 2. a 3. soustředění. Mgr. Pavel Vávra 9103@mail.vsfs.cz. Kombinované studium Skupina N9KMK3PH (vm3aph)

Databázové systémy Tomáš Skopal

1 Tabulky Příklad 7 Access 2010

Kapitola 4: SQL. Základní struktura

Analýza a modelování dat. Přednáška 9

Materializované pohledy

2. blok část B Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE

Tiskové sestavy. Zdroj záznamu pro tiskovou sestavu. Průvodce sestavou. Použití databází

KIV/ZIS - SQL dotazy. stáhnout soubor ZIS- 04_TestovaciDatabaze accdb. SQL dotazy. budeme probírat pouze SELECT

Analýza a modelování dat. Přednáška 8

41 Konzultace bariéry

Microsoft Access. Typy objektů databáze: Vytvoření a návrh nové tabulky. Vytvoření tabulky v návrhovém zobrazení

TimescaleDB. Pavel Stěhule 2018

Databáze I. Přednáška 2

5. POČÍTAČOVÉ CVIČENÍ

Úvod do MS Access. Modelování v řízení. Ing. Petr Kalčev

Transkript:

Praktické ukázky použití SQL Informační a znalostní systémy

Preambule Cílem tohoto studijního materálu je pomocí řešených příkladů seznámit čtenáře s problematikou dotazů v jazyce SQL, zejména se získáváním dat z databáze. Materiál rozšiřuje návrh systému na monitoring senzorové sítě budovy (ze cvičení) o vyhodnocování stavů budovu a spouštění akcí. Databázový systém bude na základě posledního uloženého stavu senzorů v budově spouštět různé akce(např. zapni odvětrávání), přičemž k aktivaci jedné akce může vést více pravidel(což v principu umožnuje aktivující stavy slučovat pomocí logického součtu). Zároveň požadujeme podporu akcí, které budou spuštěny na základě splění více podmínek, tedy řetězení podmínek pomocí logického součinu. Pro jednoduchost systém pracuje pouze s podmínkami, že naměřená hodnota je srovnávána(větší nebo menší) než definovaný práh. Příslušné rozšířené schéma použité v tomto materiálu je uvedeno níže:

Obsah 1 Jednoduché získávání dat 5 1.1 Výpisměřenízaposlednítýden... 5 1.1.1 Stránkovánívýpisu...... 5 1.2 Spojovánítabulek...... 7 1.3 Agregace.... 8 1.3.1 Průměrnéhodnotysenzorů..... 9 1.3.2 Podmínkynaagregačnífunkce... 9 1.3.3 Vyhodnocenípodmínek-aktivaceakcí... 10 2 Vnořené dotazy 13 2.1 Vnořený...... 13 2.1.1 Seznampřetopenýchsenzorů.... 13 2.1.2 Posledníměření.... 14 2.2 Pohled... 15 2.2.1 Pohledproposledníměření..... 15 3

4 OBSAH

Kapitola 1 Jednoduché získávání dat Kapitola se věnuje nejjednodušším příkladů použití příkazu 1.1 Výpis měření za poslední týden Zadání Vypište všechny naměřené záznamy za poslední týden Postup Měření jsou uložena v tabulce mereni obsahující vedle hodnoty i čas měření a identifikaci veličiny a senzoru. Zadání přesně nespecifikuje, které atributy požadujeme, budeme uvažovat všechny, tedy namísto výčtu atributů uvedeme symbol Ze všech záznamů v tabulce vybereme pouze ty, které nejsou starší 7 dnů. Funkce now() vrací aktuální čas, podmínka v rámci klíčového slova WHERE odpovídající záznamy mladší jednoho týdne musí od aktuálního času odečíst 7 dní. SQL WHERE cas > now() - INTERVAL 7 days ; 1.1.1 Stránkování výpisu Dotaz výše může vrátit poměrně velký počet záznamů, přenos takového množství záznamů bývá mnohdy z důvodu omezené(přenosové) kapacity 5

6 KAPITOLA 1. JEDNODUCHÉ ZÍSKÁVÁNÍ DAT nežádoucí, navíc uživatel typicky nepožaduje výpis všech relavatních dat (neb je sám není schopen najednou zpracovat). Z tohoto důvodu přistupujeme ke stránkování výstupu. Zadání Vypište posledních 100 naměřených záznamů za poslední týden Postup Požadavek na zobrazení 100 záznamů realizujeme přidáním klíčového slova LIMIT. Druhým rozdílem v zadání je, že chceme vybrat posledních 100 záznamů. Tento požadavek lze realizovat seřazením záznamů podle času pomocí použití klíčového slova ORDER BY SQL WHERE cas > now() - INTERVAL 7 days ORDER BY cas LIMIT 100; Poznámky Zadání lze modifikovat na zobrazení n-té stránky po z záznamech, tedy výběrzáznamůod(n z+1)-téhodo((n+1)z)-tého.toholzedocílit rozšířením klíčového slova LIMIT o sekci OFFSET, v tomto konkrétním případělimit zoffset(n z+1). Neboť pořadí záznamů uložených v databázi je náhodné, při praktických využití klíčového slova LIMIT je vždy nutné záznamy seřadit podle nějakého kritéria. Pokud záznamy nebudou seřazeny, může dojít ke změně pořadí záznamů uložených v databázi, v čehož důsledku při zobrazení další stránky mohou být některý ze záznamů zobrazen vícekrát a naopak, ikdyž projdeme všechny stránky, nemusí být některý ze záznamů vůbec zobrazen. Námět k zamyšlení Otázka 1 Mohou při uvedeném dotazu rozšířeném o klíčové slovo OFFSET nastat(ve smyslu druhé poznámky) nějaké problémy?

1.2. SPOJOVÁNÍ TABULEK 7 1.2 Spojování tabulek V okamžiku návrhu databázového modelu dekomponujeme entity tak, aby model splňoval podmínku alespoň třetí normální formy, tj. aby data byla uložena korektně bez možnosti vzniků konfliktů, potažmo nekonzistencí. Tento pohled však nemůžeme očekávat od uživatele, ten samozřejmě vyžaduje svůj nedekomponovaný pohled na data. Nejen z tohoto důvodu SQL umožňuje pro potřeby vyhodnocení dotazu tabulky spojovat. Zadání Vypište zaznamenaná měření s uvedením názvu, značky a jednotky veličiny. Postup Ze zadání vyplývá, že k zobrazení požadovaného výstupu bude zapotřebí tabulek mereni a velicina. 1. První možností je uvést všechny použité tabulky za klíčové slovo FROM. Tento způsob vede na vytvoření kartézkého součinu mezi záznamy obou tabulek, ze kterého WHERE podmínkou stanovíme, že požadujeme pouze kombinace záznamů, u nihž hodnota cizího klíče odpovídá hodnotě primárního klíče(pokud se atribytou obou klíčů jmenují identicky, je potřeba jich rozlišit pomocí notace tabulka.atribut. V tomto případě zápis bude,velicina WHERE mereni.id_velicina = velicina.id_velicina AND cas > now() - INTERVAL 7 days ; 2. Zatímco u prvního přístupu dochází k míchání podmínek pro spojování tabulek(korenspondencí hodnot primárního a cizího klíče) s podmínkami na hodnoty atributů, což není z důvodu přehlednosti zápisu vhodné, SQL umožňuje zapsat podmínky přímo do sekce klíčového slova FROM v syntaxi tabulka JOIN tabulka následované vazební podmínkou. V našem konkrétním případě FROM mereni JOIN velicina ON (mereni.id_velicina = velicina.id_velicina) WHERE cas > now() - INTERVAL 7 days ;

8 KAPITOLA 1. JEDNODUCHÉ ZÍSKÁVÁNÍ DAT 3. Pokud navíc jména atributů cizího a primárního klíče jsou identická, je možné použít variantu s klíčovým slovem USING namísto ON JOIN velicina USING (id_velicina) WHERE cas > now() - INTERVAL 7 days ; Pokud jsou atributy primárního a cizího klíče stejnojmenné a mapování stejnojmených atributů vždy odpovídá mapování párů cizí- primární klíč, je možné použít tzv. přirozené spojení automaticky párující klíče. NATURAL JOIN velicina WHERE cas > now() - INTERVAL 7 days ; Nevýhodou tohoto přístupu je, že pokud do tabulky přidáme nový atribut, jehož jméno bude shodné s jiným již existujícím atributem, vyhodnotí se toto jako nový pár klíčů a původní dotaz přestane vracet očekávaný výsledek (např. přidání atributu čas do tabulky veličina odpovídající času přidání příslušné veličiny bude mít za následek, že předchozí dotaz zobrazí pouze ta měření, která odpovídají času přidání dané veličiny. V rámci jednoho dotazu je možné spojovat i více tabulek přidáním další podsekce JOIN Otázky Otázka 2 Zobrazte poslední naměřený záznam ve formě tabulky s označením senzoru, jménem a značkou veličiny a hodnotou s jednotkou veličiny. Otázka 3 Vyhodnoťte, které podmínky jsou pro dané měření splněny. Otázka 4 Vypište seznam senzorů, které se dosud nenaměřili nějakou veličinu, kterou jinak měřit umožňují. 1.3 Agregace SQL podporuje možnost použití agregačních funkcí. Agregační funkce vyhodnocují celou množinu hodnot(z více záznamů) uvedeného atributu a vracejí jedinou hodnotu. Množina záznamů, přes které se agreguje, označujeme agregační úrovní. Typické agregační funkce jsou počet COUNT, minimum MIN, maximum MAX,součetSUMaprůměrAVG.

1.3. AGREGACE 9 1.3.1 Průměrné hodnoty senzorů Zadání Vypište průměrné naměřené hodnoty senzorů. Postup SQL 1. Nejprve připravíme vstupní tabulku pro agregační funkce. V tomto případě je to jednoduchý výpis záznamů z tabulky mereni 2. stanovíme agregační úroveň, tedy to, přes které atributy chceme agregovat. V tomto konkrétním případě je agregační úrovní kombinace id senzor, id velicina. Agregační úroveň nastavíme pomocí klíčového slova GROUP BY. 3. Ve výčtu atributů mohou být buďto atributy, přes které se agreguje, nebo agregační funkce, nic jiného. V našem případě id senzor, id velicina a agregační funkce AVG(hodnota). id_senzor, id_velicina, AVG(hodnota) as prumernahodnota GROUP BY id_senzor, id_velicina; Otázka 5 Rozšiřte uvedený dotaz o výpis počtu provedených měření a o maximální a minimální hodnotu. Proveďte výpis v člověkem srozumitelné podobě. Poznámky Pokud není agregační úroveň stanovena, je uvažována celá tabulka. 1.3.2 Podmínky na agregační funkce Stejně jako je vhodné definovat WHERE podmínky na samotné v tabulkách uložené záznamy, SQL přináší možnost definovat podmínky na hodnoty agregačních funkcí. Například, u předchozího případu můžeme požadovat, aby byly zobrazeny pouze teploty(předpokládejme id veličina=1) a zobrazovaly se pouze průměry počítané z více než 10 vzorků.

10 KAPITOLA 1. JEDNODUCHÉ ZÍSKÁVÁNÍ DAT Postup Zatímco první podmínka je podmínka svázaná se vstupními daty, jedná se o podmínku, která bude zadána v sekci WHERE. Naopak podmínka, aby byly zobrazeny pouze agregované záznamy, pokud zahrnují alespoň 10 záznamů, je podmínka na agregační funkci, která musí být zapsána do sekce HAVING. SQL id_senzor, id_velicina, AVG(hodnota) as prumernahodnota WHERE id_velicina = 1 GROUP BY id_senzor, id_velicina HAVING count()>10; Poznámka Všimnětesi,žemeziWHEREaHAVINGpodmínkamijezásadnírozdílanemohou být navzájem zaměněny. Zatímco WHERE podmínka říká, která data budou použita pro agregaci, HAVING počítá s již proběhlou evaluací hodnot agregačních funkcí(a tedy následuje za sekcí GROUP BY). 1.3.3 Vyhodnocení podmínek- aktivace akcí Agregaci můžeme využít v mnohý aplikacích, které na první pohled s průměrováním a podobnými operacemi nemají nic společného. Zadání Na základě záznamů v tabulkách pravidlo,podminka a mereni stanovte, ktere akcemajíbýtvdanémčaseaktivní.akcejespuštěnazapodmínkysplnění všech dílčích podmínek. Pro jednoduchost uvažujte, že měření veličin je synchonní, tj. probíhá ve stejný čas. PostupaSQL Prvně je potřeba připravit vstupní data pro agregaci. Na jedné straně spojovaných tabulek je mereni, na druhé pak podmínka. Tabulka mereni musí být připojena pomocí OUTER JOIN. FROM pravidlo JOIN podminkapravidlo USING (id_pravidlo)

1.3. AGREGACE 11 JOIN pravidlo USING (id_pravidlo) JOIN mereni USING (id_senzor,id_velicina); Dále, pro aktivaci pravidla musejí být splněny všechny podmínky, CASE WHEN typ= < THEN hodnota < prahovahodnota WHEN typ= > THEN hodnota > prahovahodnota ELSE false END as platna a požadujeme, aby v daném čase byla splněny všechny podmínky, tedy budeme agregovat přes čas a id pravidla. Pro vyjádření podmínky na splnění všech dílčích podmínek aktivace použijeme faktu, že počet platně vyhodnocených podmínek(nasčítaných, nelze kombinovat různé agregační úrovně) je shodný s celkovým počtem podmínek, tedy SUM (CASE WHEN typ= < THEN 1 WHEN typ= > THEN 1 ELSE 0 END) = count() as aktivuj Celý dotaz tedy bude id_akce,id_pravidlo,cas, SUM (CASE WHEN typ= < THEN 1 WHEN typ= > THEN 1 ELSE 0 END) = count() as aktivuj FROM pravidlo JOIN podminkapravidlo USING (id_pravidlo) JOIN pravidlo USING (id_pravidlo) JOIN mereni USING (id_senzor,id_velicina) GROUP BY id_akce,id_pravidlo,cas; Otázka 6 Je dotaz funkční za všech okolností?

12 KAPITOLA 1. JEDNODUCHÉ ZÍSKÁVÁNÍ DAT

Kapitola 2 Vnořené dotazy Mnohdy se při práci dostaneme do situace, kdy je nutné získat mezivýsledek atendálepoužít.vsqlktomusložítzv.vnořenéy. 2.1 Vnořený 2.1.1 Seznam přetopených senzorů Ukázku použití vnořeného u demonstujme na jednoduchém příkladu Zadání Vypište kompletní popis senzorů, u kterých byla naměřena teplota( id velicina =1)vyššínež40C. PostupaSQL Nejprve začneme s poddotazem- které senzory naměřily teplotu vyšší než 40 C, vraťme hodnotu cizího klíče. id_senzor WHERE id_velicina = 1 AND hodnota>40; Nyní připravme druhou část dotazu- bez podmínky FROM senzor; V rámci tohoto dotazu nyní potřebujeme zajistit, že budou zobrazeny pouze ty senzory, které odpovídají poddotazu. To lze zajistit pomocí konstukce vnořeného u pomocí notace 13

14 KAPITOLA 2. VNOŘENÉ DOTAZY IN ( x...) Celý dotaz: FROM senzor WHERE id_senzor IN ( id_senzor WHERE id_velicina = 1 AND hodnota>40 ); Poznámka V mnohých případech lze dotaz formulovat i bez vnořeného u. Lze toivtomtopřípadě? 2.1.2 Poslední měření Vnořenýjemožnévkládatiuvýrazů.Vtakovémpřípadějenutno brát na zřetel, že se vyhodnotí tolikrát, kolik je záznamů. Zadání Pro každou kombinaci veličiny a senzoru vypište čas posledního měření a poslední naměřenou hodnotu. PostupaSQL První, jednodušší možností použitelnou při synchronizovaném měření je získat čas posledního měření cas ORDER BY cas DESC LIMIT 1; a následně vypsat pouze záznamy měření odpovídající tomuto času. Celý dotaz: WHERE cas = (

2.2. POHLED 15 cas ORDER BY cas DESC LIMIT 1); U asynchronního ukládání dat je problém složitější, neb nemůžeme výpis odvodit od jediného času(z tabulky mereni), ale je nutné jej odvozovat od přípustných kombinací z tabulky senzorvelicina. Úkol senzorvelicina., ( cas WHERE mereni.id_velicina = senzorvelicina.id_velicina AND mereni.id_senzor = senzorvelicina.id_senzor ORDER BY cas DESC LIMIT 1) as cas, ( hodnota WHERE mereni.id_velicina = senzorvelicina.id_velicina AND mereni.id_senzor = senzorvelicina.id_senzor ORDER BY cas DESC LIMIT 1) as hodnota FROM senzorvelicina; Porovnejte reálnou časovou náročnost zobrazení posledních hodnot u synchronního a asynchronního přenosu měření. Použite příkaz EXPLAIN Otázka 7 Je dotaz funkční za všech okolností? Poznámka Všimněte si, že vnořené y na pozici vyhodnocení výrazu bezpodmínečně musí vrátit jedinou hodnotu. Z toho důvodu je bežně používáno omezení LIMIT 1. 2.2 Pohled U složitých dotazů používaných jako subdotazy je vhodné použít tzv. pohledu. Pohled je nematerilizovaná náhrada za složitý. Pohled lze vytvořit pomocí příkazu CREATE VIEW. 2.2.1 Pohled pro poslední měření Zadání Vytvořte pohled odpovídající posledním nameřeným hodnotám, viz předchozí odstavec, a demonstujte použití pohledu.

16 KAPITOLA 2. VNOŘENÉ DOTAZY SQL CREATE VIEW poslednimereni AS senzorvelicina., ( cas WHERE mereni.id_velicina = senzorvelicina.id_velicina AND mereni.id_senzor = senzorvelicina.id_senzor ORDER BY cas DESC LIMIT 1) as cas, ( hodnota WHERE mereni.id_velicina = senzorvelicina.id_velicina AND mereni.id_senzor = senzorvelicina.id_senzor ORDER BY cas DESC LIMIT 1) as hodnota FROM senzorvelicina; Použití Kpohledusechovámestejnějakobytobylatabulka,tj.např. FROM poslednimereni;

Odpovědi na otázky Odpověď 1 Záznamy jsou v databázi uloženy v náhodném pořadí, přičemž uvedené kritérium nepokrývá celý primární klíč(jednoznačně definující záznam). Tedy uspořádání podle jiného kritéria než podle minimálně všech atribitů primárního klíče(těch v libovolném pořadí) nedefinuje jednoznačné pořadí záznamů. Tuto situaci lze demonstrovat na např. aplikaci multiplikátoru na hodnoty naměřené daným senzorem. Databázový stroj typicky nově upravené záznamy přesouvá na konec; pokud bychom řadili pouze podle času a stejnému času by odpovídalo více nežli 100 hodnot, některé záznamy by nebyly zobrazeny a modifikované by byly zobrazeny 2x. Druhý problém nastává při přidávání nových měření, kdy hranice původního prvního se posouvá. Tento problém již vyžaduje sofistifikované řešení. Odpověď 2 Vzhledem k tomu, že tabulky senzor a velicina obsahují stejnojmenný atribut nazev, je potřeba tyto různé atributy odlišit pomocí notace tabulka.atribut. V tomto případě je vhodné tyto atributy rozlišit i ve výpisu pomocí zadaného aliasu klíčovým slovem AS. Poslední měření získáme seřazením záznamů podle času sestupně a ponecháme pouze první záznam, tj. LIMIT 1. senzor.nazev as senzor, velicina.nazev as velicina, hodnota jednotka as hodnota JOIN velicina USING (id_velicina) JOIN senzor USING (id_senzor) ORDER BY cas DESC LIMIT 1; Povšimněte si, že zatímco u spojování tabulek mereni a velicina bylo možné použit NATURAL JOIN, u připojení třetí tabulku senzor to již možné není. Proč? 17

18 KAPITOLA 2. VNOŘENÉ DOTAZY Odpověď 3 mereni., typ, prahovahodnota, CASE WHEN typ= < THEN hodnota < prahovahodnota WHEN typ= > THEN hodnota > prahovahodnota ELSE false END as platna JOIN podminka USING (id_velicina,id_senzor); Součástí dotazu je vyhodnocení CASE větvení, za kterým následuje vždy podsekce WHEN... THEN..., která udává, jakou hodnotu bude výraz vracet při splnění příslušné podmínky. Pokud není splněna žádná z uvedených podmínek, je vrácena prázdná hodnota NULL nebo výraz uvedený v podsekci ELSE. Odpověď 4 Seznam veličin, který daný senzor umí měřit, nalezneme v tabulce senzorvelicina, seznam měření pak v tabulce mereni. Tyto tabulky potřebujeme spárovat pomocí INNER JOIN, abychom dosud měřeními nepokrytými kombinacemi senzor, veličina získali požadovaný seznam(libovolný z atributů povinně vyplnitelných bude nabývat prázdné hodnoty). senzorvelicina., FROM senzorvelicina LEFT JOIN mereni USING (id_velicina,id_senzor) WHERE cas IS NULL; Odpověď 5 Podmínku lidské čitelnosti splníme použitím dotazu z odpovědi 2. Vstupní tabulkou pro agregaci pak bude dotaz senzor.nazev as senzor, velicina.nazev as velicina, hodnota, jednotka JOIN velicina USING (id_velicina) JOIN senzor USING (id_senzor); Agregovat pak budeme přes název senzoru, název veličiny a jednotce, která je na atributech definující agregační úroveň funkčně závislá. senzor.nazev as senzor, velicina.nazev as velicina, COUNT() as pocet,

2.2. POHLED 19 AVG(hodnota) as prumer, MIN(hodnota) as min, MAX(hodnota) as max, jednotka JOIN velicina USING (id_velicina) JOIN senzor USING (id_senzor) GROUP BY senzor.nazev, velicina.nazev, jednotka; Odpověď 6 Ze zadání jsou měření synchronní, tedy záznamy měření přes různé veličiny a senzory mají stejný čas. To však nezaručuje, že tabulka obsahuje všechna požadované měření, tedy že měří všechny senzory. Díky tomu je potřeba uvažovat situaci, kdy některé z podmínek odpovídá senzoru aveličině,jehožměřenínenívdanýčaskdispozici.vtakovémpřípaděnení zajištěno,žepodmínka(vrealitě)jesplněna.otázkouje,zdakakcimádojít pouze za splnění všech podmínek a nebo postačuje, že žádná z požadovaných podmínek není nesplněna. Odpověď 7 Nyní jsou měření asynchronní, navíc odpadá problém, že v případě absence měření nebude uvedena žádná hodnota(nejednoznačné rozhodování o aktivaci akce, viz synchronní přenos u příkladu výše). V případě, že žádné odpovídající meření nebylo realizováno, vrací dotaz prázdnou hodnotu NULL