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



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

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

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

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

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

Databázové systémy I

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

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

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

5. blok Souhrnné a skupinové dotazy

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

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

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

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

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

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

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

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

8 Třídy, objekty, metody, předávání argumentů metod

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

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

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

Operátory ROLLUP a CUBE

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

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

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

RELAČNÍ DATABÁZOVÉ SYSTÉMY

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

13. blok Práce s XML dokumenty v databázi Oracle

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

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

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

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

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

Relační DB struktury sloužící k optimalizaci dotazů - indexy, clustery, indexem organizované tabulky

Databáze SQL SELECT. David Hoksza

4. lekce Přístup k databázi z vyššího programovacího jazyka

Kritéria hodnocení praktické maturitní zkoušky z databázových systémů

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

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

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

Optimalizace SQL dotazů

Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Jihlava

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

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

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

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

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

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

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

Virtuální privátní databáze

Informační systémy 2008/2009. Radim Farana. Obsah. Jazyk SQL

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.

Objektově relační databáze a ORACLE 8

Michal Krátký. Tvorba informačních systémů, 2008/2009. Katedra informatiky VŠB Technická univerzita Ostrava. Tvorba informačních systémů

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

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

Fyzické uložení dat a indexy

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

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

Jazyk S Q L základy, příkazy pro práci s daty

Základy databází. O autorech 17 PRVNÍ ČÁST. KAPITOLA 1 Začínáme 19

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

Kritéria hodnocení praktické maturitní zkoušky z databázových systémů

Optimalizace dotazů a databázové transakce v Oracle

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

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

PHP a Large Objecty v PostgreSQL

Multi-dimensional expressions

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.

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

Architektury databázových

Sada 1 - PHP. 14. Úvod do jazyka SQL

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

6 Příkazy řízení toku

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

Databáze pro evidenci výrobků

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

1 Webový server, instalace PHP a MySQL 13

DATABÁZE MS ACCESS 2010

Kontingenční tabulky v MS Excel 2010

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

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

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

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

Jazyk XSL XPath XPath XML. Jazyk XSL - rychlá transformace dokumentů. PhDr. Milan Novák, Ph.D. KIN PF JU České Budějovice. 9.

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

Inovace a zkvalitnění výuky prostřednictvím ICT. Základní seznámení s MySQL Ing. Kotásek Jaroslav

Nerelační databázové modely. Helena Palovská

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

Střední odborná škola a Střední odborné učiliště, Hořovice

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Měřící systém se vzdáleným přístupem. Databáze

Tvorba informačních systémů

Databázové systémy. Doc.Ing.Miloš Koch,CSc.

Vzorové příklady SQL. Tabulka: Kniha CREATE TABLE kniha (id INTEGER, název VARCHAR(50), PRIMARY KEY (id))

DNS. Počítačové sítě. 11. cvičení

Obsah. SQL konstrukce select join Rekurze (rekurzivní with) Analytické funkce, group by Pivoting

MS Access Dotazy SQL

Transkript:

12. blok Pokročilé konstrukce SQL dotazů - část II Studijní cíl Tento blok je věnován pokročilým konstrukcím SQL dotazů, které umožní psát efektivní kód. Pozornost je věnována vytváření pohledů v rámci dotazů pomocí klauzule WITH a procházení stromovou strukturou. Doba nutná k nastudování 2-3 hodiny Průvodce studiem Při studiu tohoto bloku se předpokládá, že čtenář je s DML příkazy jazyka SQL. 1. In-line pohledy Pokud se poohlédneme zpět do kurzu IDAS1, najdeme v lekci o pohledech kapitolu hovořící o In-line pohledech. In-line pohled je vnořený dotaz, který má vlastní alias. V příkazu se s in-line pohledem pracuje stejně, jako s běžnou tabulkou. Syntaxe in-line pohledu je: * FROM ( * FROM tabulka) nazev_pohledu; Použití in-line pohledů jsme prezentovali na jednoduchém příkladu. vproduktydodavatele.nazev, ROUND(AVG(vProduktyDodavatele.cena),2) as prumerna_cena FROM ( dodavatele.nazev, produkty.oznaceni, produkty.produkt_id, dodavatele.dodavatel_id, produkty.cena FROM dodavatele JOIN produkty ON produkty.dodavatel_id = dodavatele.dodavatel_id ) vproduktydodavatele GROUP BY vproduktydodavatele.nazev; 1

Pro správné pochopení si nyní dotaz rozebereme. Nejdříve byl vyhodnocen in-line pohled vproduktydodavatele. Výstupem z toho pod-dotazu byla množina výsledků, na kterou se provedl druhý dotaz. Stejný příklad by bylo možné řešit i pomocí klasických pohledů: CREATE VIEW vproduktydodavatele AS dodavatele.nazev, produkty.oznaceni, produkty.produkt_id, dodavatele.dodavatel_id, produkty.cena FROM dodavatele JOIN produkty ON produkty.dodavatel_id=dodavatele.dodavatel_id WITH READ ONLY; vproduktydodavatele.nazev, ROUND(AVG(vProduktyDodavatele.cena),2) as prumerna_cena FROM vproduktydodavatele GROUP BY vproduktydodavatele.nazev; 2. Dočasné pohledy - klauzule WITH Jedním z řešení pro zvýšení čitelnosti a srozumitelnosti dotazů je použití klauzule WITH - kdy hovoříme o Common Table Expression (CTE). CTE je dočasný pohled (temporary view) a používá se zejména v případech, kdy nějaký poddotaz je v rámci dotazu použit vícekrát, nebo - jak si ukážeme v následující kapitole, pro konstrukci rekurzivních dotazů. Výše uvedený příklad můžeme například zapsat následovně s použitím CTE: WITH vproduktydodavatele AS ( dodavatele.nazev, produkty.oznaceni, produkty.produkt_id, dodavatele.dodavatel_id, produkty.cena FROM dodavatele JOIN produkty ON produkty.dodavatel_id=dodavatele.dodavatel_id) vproduktydodavatele.nazev, ROUND(AVG(vProduktyDodavatele.cena),2) 2

as prumerna_cena FROM vproduktydodavatele GROUP BY vproduktydodavatele.nazev; Samozřejmě tímto řešením dostaneme shodný výsledek jako v přechozím případě. CTE významně zvyšují přehlednost dotazů. Navíc není nutné vytvářet pohledy ve smyslu samostatných databázových objektů, ale definovat je jako dočasné pohledy v rámci konkrétních dotazů. Klauzule WITH tedy umožňuje přiřadit název určitému poddotazu uvedenému před vlastním (hlavním) dotazem. V něm se pak můžete odkazovat na tento dočasný pohled zadáním jeho jména obdobně jako při práci s pohledy. Oracle optimalizuje zpracování dočasného pohledu uvedeného jména, pracuje s ním buď jako s inline pohledem nebo jako s dočasnou tabulkou. Jednotlivé dočasné pohledy se mohou odkazovat na předchozí - dříve definované dočasné pohledy, stejně jako se na ně odkazuje hlavní dotaz. Použití klauzule WITH je velice vhodné v případě, kdy je výsledek dočasného pohledu odkazován vícekrát v rámci jediného dotazu, když například průměrné hodnoty zjištěné dočasným pohledem musí být několikrát porovnávány během vykonávání dotazu a běžné řešení by znamenalo bud zřízení samostatného pohledu nebo uvedení několika totožných vnořených dotazů v rámci hlavního dotazu. Obecná syntaxe je: WITH <alias_name> AS (subquery_sql_statement) [, <alias_name> AS (subquery_sql_statement) ] <column_name_list> FROM ; 3

3. Hierarchické dotazy (Oracle 10g) Hierarchické dotazy slouží k získání dat seřazených v hierarchickém pořadí. Dotaz je možné použít také nad spojením dvou či více tabulek. Základní princip Jak je zobrazeno na následujícím obrázku, hierarchický dotaz vyžaduje navíc pouze klauzuli CONNECT BY, která definuje, přes které atributy se bude provádět spojení hierarchických dat. K definici nadřazeného atributu je k dispozici klauzule PRIOR. Pomocí konstrukce START WITH, můžeme definovat, od kterého záznamu má být dotaz vyhodnocován. Klauzule NOCYCLE zamezí cyklickému procházení dat. Ke zjištění, na kterém záznamu vzniká cyklický odkaz, slouží pseudo-sloupec CONNECT_BY_ISCYCLE, který obsahuje hodnotu 1 pro řádky, kde k cyklickému odkazu došlo jinak 0. V rámci hierarchických dotazů, je k dispozici také pseudo-sloupec LEVEL, který zobrazuje úroveň záznamu v hierarchické posloupnosti. Dále máme k dispozici další funkce a operátory pro práci nad hierarchicky organizovanými daty. Pseudo-sloupec CONNECT_BY_ISLEAF Pseudosloupec, který nabývá hodnotu 1, pokud záznam je v hierarchické úrovni listem. Jinak nabývá hodnotu 0., CONNECT_BY_ISLEAF as jelistem, FROM CONNECT BY 4

Pseudo-sloupec CONNECT_BY_ROOT Operátor, který vrátí pro daný sloupec hodnotu na nejvyšší hierarchické úrovni., CONNECT_BY_ROOT jmeno as jmenoreditele, FROM CONNECT BY Pseudo-sloupec SYS_CONNECT_BY_PATH Funkce, která vrací kompletní cestu sestavenou pomocí sloupce, který vstupuje jako atribut a oddělovače, který vstupuje jako druhý atribut., SYS_CONNECT_BY_PATH(jmeno, '/') as jmenocesta, FROM CONNECT BY Pro třídění dat se zachováním hierarchické úrovně, je možné použít v klauzuli ORDER BY klíčové slovo SIBLINGS, které toto zajišťuje. Data jsou na výstupu řazena podle atributů uvedených v klauzuli GROUP BY, ale vždy pouze v rámci množiny, která má stejného předka. V dotazu je klauzule použita následovně. FROM CONNECT BY ORDER BY SIBLINGS jmeno ASC 5

Postup vyhodnocení hierarchických dotazů 1. Nejdříve jsou vyhodnocena spojení tabulek, pokud jsou k dispozici. 2. Řádky vyhovující podmínce ve START WITH jsou považovány za kořenové řádky na první úrovni vnoření 3. Pro každý řádek na úrovni i se rekurzivně hledají přímí potomci vyhovující podmínce v klauzuli CONNECT BY na úrovni i+1, řádek předka se v podmínce označuje klíčovým slovem PRIOR 4. Na závěr jsou odstraněny řádky nevyhovující podmínce uvedenou v klauzuli WHERE 5. Pokud není definováno třídění, odpovídá pořadí průchodu pre-order Příklad použití Fungování hierarchických dotazů si můžeme ukázat na jednoduchém příkladu. Máme tabulku, která popisuje osoby. Obsahuje atributy jméno, příjmení, adresu, datum narození a pohlaví označené písmenem M pro muže a písmenem Z pro ženu. Dále je zde také přítomen atribut ID, sloužící jako jednoznačná identifikace každé osoby, která se v tabulce nachází. Součástí tabulky jsou také identifikátory (ID) otce a matky každé osoby. Pokud tedy vezmeme v úvahu následující generační strom, tabulku si můžeme představit následovně: Jan Malý Jarmila Malá Martin Veselý Jana Mala Petr Ostnatý Petr Vyndal Petra Veselá Jan Veselý Robert Ostnatý Marta Velká Jan Vyndal Ivana Ostnatá Lenka Ostnatá Obr. 1 - Generační strom pro interpretaci hierarchických dotazů 6

ID Jméno Příjmení Pohlaví Datum narození ID otce ID matky 1 Jan Malý M 10. 3. 1898 (null) (null) 2 Jarmila Malá Z 4. 6. 1901 (null) (null) 3 Jana Malá Z 3. 12. 1920 1 2 4 Jarmil Veselý M 9. 9. 1921 (null) (null) 5 Petr Ostnatý M 14. 1. 1918 (null) (null) 6 Petra Veselá Z 5. 5. 1941 4 3 7 Jan Veselý M 2. 10. 1945 4 3 8 Robert Ostnatý M 8. 2. 1948 5 3 9 Petr Vyndal M 25. 7. 1947 (null) (null) 10 Marta Velká Z 13. 9. 1950 (null) (null) 11 Jan Vyndal M 14. 12. 1963 9 6 12 Ivana Ostnatá Z 4. 7. 1972 8 10 13 Lenka Ostnatá Z 14. 4. 1975 8 10 Tabulka Ilustrační obsah tabulky osoby Nyní bude ilustrován rozdíl mezi použitím běžného dotazu a použitím hierarchického dotazu. Veškeré dotazy budou pracovat s tabulkou osoby, která je znázorněna výše. Dotazy jsou platné pro databázový server Oracle verze 10g. První příklad použití hierarchických dotazů bude nalezení společných potomků Jarmily Malé a Jana Malého. Nejdříve zápis pomocí běžného dotazu bez použití klauzule CONNECT BY. osoby.* WHERE id_matky = ( id WHERE jmeno='jarmila' AND prijmeni='malá' ) AND id_otce = ( id WHERE jmeno='jan' AND prijmeni='malý' ); 7

Klasický dotaz využívá dvou vnořených dotazů, pro zjištění identifikátoru osob, které následně vstupují do podmínky. Pokud použijeme hierarchický dotaz s klauzulí CONNECT BY, zbavíme se vnořených dotazů. osoby.* CONNECT BY id_matky = PRIOR id AND id_otce = PRIOR id START WITH (jmeno, prijmeni) IN (('Jarmila','Malá'),('Jan','Malý')) WHERE level = 2 Na první pohled je hierarchický dotaz přehlednější než dotaz běžný. Není třeba žádných vnořených dotazů. Za klauzulí START WITH je použit konstruktor řádkové hodnoty pro nalezení potřebných kombinací jména a příjmení. Podmínka na konci dotazu říká, že mají být zobrazeny pouze záznamy na úrovni 2, což jsou potomci osob, které jsou zadané za klauzulí START WITH. Výstupem z následujícího příkladu jsou všichni vnuci Jarmily Malé. Běžným dotazem je možné výsledku dosáhnout za použití tří do sebe vnořených dotazů. Dotaz na nejnižší úrovni zjišťuje identifikátor Jarmily Malé, druhý dotaz zjišťuje všechny děti Jarmily Malé a teprve až třetí dotaz vrátí požadovaný výsledek, tedy vnuky. osoby.* WHERE id_otce OR id_matky IN ( id WHERE id_matky = ( id WHERE jmeno='jarmila' AND prijmeni='malá' ) ) AND pohlavi='m'; Naproti tomu hierarchický dotaz je téměř stejný jako u prvního příkladu, pouze se liší podmínky za klauzulí START WITH a WHERE. 8

osoby.* CONNECT BY PRIOR id = id_otce AND PRIOR id = id_matky START WITH jmeno='jarmila' AND prijmeni='malá' WHERE level=3 AND pohlavi='m'; Posledním příkladem použití hierarchických dotazů je zjištění všech žen, které jsou pokrevně spřízněny s párem Jarmila Malá a Jan Malý. Jedná se na první pohled o primitivní úlohu, ale běžným dotazem ji není možné realizovat v přehledné formě. Použití hierarchického dotazu je však stále jednoduché a mění se pouze podmínky. Pro definování počátku hierarchické úrovně, je opět využito konstruktoru řádkové hodnoty. osoby.* CONNECT BY id_matky = PRIOR id AND id_otce = PRIOR id START WITH (jmeno, prijmeni) IN ('Jarmila','Malá'),('Jan','Malý')) WHERE pohlavi='z' Jak vyplývá z uvedených příkladů, některá zadání již běžnými dotazy není možné řešit a použití hierarchických dotazů je nezbytné. Úlohy, na které je ještě možné běžné dotazy použít, působí při použití hierarchických dotazů více přehledně a minimalizuje se tak možnost chyb při psaní dotazů. Na rozdíl od běžných dotazů je však tento typ značně náročnější na výpočetní výkon databázového stroje. Pokud byste chtěli výstup z dotazu použít pro zobrazení ve formě rozbalovací hierarchie tak, jak to třeba dělá u souborů Windows Explorer, bude se vám hodit i pseudosloupec CONNECT_BY_ISLEAF, který určuje, zda je aktuální záznam na poslední úrovni hierarchie (CONNECT_BY_ISLEAF=1) nebo zda má podřízené záznamy (CONNECT_BY_ISLEAF=0). Níže uvedený příklad využívají i hodnoty LEVEL pro zarovnání všech dceřiných prvků pomocí mezer vložených před názvy jména osob. lpad(' ',level*3) PRIJMENI ' ' JMENO name, SYS_CONNECT_BY_PATH(PRIJMENI, '/') path, CONNECT_BY_ROOT PRIJMENI topmgr, CONNECT_BY_ISLEAF isleaf, level FROM A_HR.ZAMESTNANCI CONNECT BY MANAZER_ID = PRIOR ZAMESTNANEC_ID START WITH MANAZER_ID is null ORDER SIBLINGS BY PRIJMENI; 9

4. Hierarchické dotazy dle ANSI SQL Od verze databázového serveru Oracle 11g je k dispozici také alternativa pro konstrukci hierarchických dotazů, která je pro databázový stroj přirozenější a může lépe optimalizovat a plánovat jeho provádění. Tato alternativa je zajištěna pomocí rekurzivního volání pohledů. Hierarchické dotazy dle ANSI SQL používají rekurzívní WITH klauzuli, která se odkazuje sama na sebe. Zavedení této syntaxe do Oracle 11gR2 zajišťuje hierarchickým dotazům Oracle SQL kompatibilitu s ANSI. Celou syntaxi si ukážeme na následujícím příkladu: WITH ORG_PRACOVNIKU (zamestnanec_id, prijmeni, jmeno, manazer_id, uroven) as ( zamestnanec_id, prijmeni, jmeno, manazer_id, 1 FROM A_HR.ZAMESTNANCI WHERE manazer_id is NULL -- začni od zaměstnance, který nemá nadřízeného UNION ALL -- spoj výsledek předchozího dotazu s výsledkem následujícího dotazu pracovnici.zamestnanec_id, pracovnici.prijmeni, pracovnici.jmeno, pracovnici.manazer_id, manazeri.uroven+ 1 FROM A_HR.ZAMESTNANCI pracovnici join ORG_PRACOVNIKU manazeri on (manazeri.zamestnanec_id = pracovnici.manazer_id) -- podmínka spojení a rekurzívní volání ) * FROM ORG_PRACOVNIKU; 10

Pojmy k zapamatování Příkazy a funkce: Klauzule WITH, CONNECT BY, CTE, hierarchické dotazy Problém: dočasné pohledy, in-line pohledy, průchod stromovou strukturou, hierarchické dotazy Shrnutí V této lekci jste se seznámili s tvorbou SQL dotazů, které umožňují pracovat s dočasnými pohledy a hierarchickými strukturami. Ačkoli se mohou mírně lišit způsoby zápisu dočasných pohledů a hierarchických dotazů mezi jednotlivými databázovými platformami, seznámili jsme se s proprietárním řešením Oracle, které je přehlednější z hlediska zápisu, tak i řešením podle ANSI SQL, které se objevuje i v dalších databázových platformách a je univerzálnější. Otázky na procvičení 1. Vysvětlete, co jsou to in-line pohledy? 2. Jak se definují dočasné pohledy v rámci SQL dotazu? 3. K čemu slouží hierarchické dotazy? 4. Uveďte obecnou syntaxi hierarchického dotazu s klauzulí CONNECT BY? 5. Jak se tvoří hierarchické dotazy podle ANSI SQL. Odkazy a další studijní prameny http://www.techonthenet.com/oracle (syntaxe příkazů SQL jazyka a funkcí) http://www.oracle.com/technetwork/database/enterpriseedition/documentation (dokumentace k databázové platformě Oracle) http://technology.amis.nl/blog/6104/oracle-rdbms-11gr2-goodbyeconnect-by-or-the-end-of-hierarchical-querying-as-we-know-it Odkazy a další studijní prameny LACKO, L. Oracle, správa, programování a použití databázového systému. Praha: Computer Press, 2007. ISBN 80-251-1490-2. Hierarchical queries. Oracle Database SQL Reference. [Online] Oracle, 2005. [Citace: 22. Duben 2011.] http://download.oracle.com/ 11