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



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

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

Databázové systémy I

5. blok Souhrnné a skupinové dotazy

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

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

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ů

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

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

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

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

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

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

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

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

Databáze SQL SELECT. David Hoksza

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

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

Stručný obsah. část III Aktualizace dat Kapitola 10: Aktualizace databáze 257 Kapitola 11: Integrita dat 275 Kapitola 12: Zpracování transakcí 307

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

2. blok Zabezpečení a ochrana dat

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

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

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

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

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

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

Operátory ROLLUP a CUBE

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

RELAČNÍ DATABÁZOVÉ SYSTÉMY

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

MS Access Dotazy SQL

KIV/ZIS - SELECT, opakování

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

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

Vkládání poddotazů do dotazů

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

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

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

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

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

Kapitola 4: SQL. Základní struktura

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

2. blok část A Jazyk SQL, datové typy

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

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

7. Integrita a bezpečnost dat v DBS

7. Integrita a bezpečnost dat v DBS

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

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

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

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

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

Materializované pohledy

Databázové systémy a SQL

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

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

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

Virtuální privátní databáze

Text úlohy. Systémový katalog (DICTIONARY):

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

SQL. strukturovaný dotazovací jazyk. Structured Query Language (SQL)

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

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

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

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

1. Relační databázový model

Práva a role. Martin Polák. NDBI013 Administrace Oracle

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

téma: Výběrové dotazy v MS Access

Materiál ke cvičením - SQL

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

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

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

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

Databázové systémy a SQL

Vkládání, aktualizace, mazání

PG 9.5 novinky ve vývoji aplikací

Replikace je proces kopírování a udržování databázových objektů, které tvoří distribuovaný databázový systém. Změny aplikované na jednu část jsou

6. SQL složitější dotazy, QBE

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

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

Databázové systémy 1

Marian Kamenický. Syntea software group a.s. marian.kamenicky. MFFUK Praha 2012/13

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

Jazyk SQL slajdy k přednášce NDBI001

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

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.

Tvorba informačních systémů

Maturitní témata z předmětu PROGRAMOVÉ VYBAVENÍ pro šk. rok 2012/2013

- sloupcové integritní omezení

1. blok Systémový katalog

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

Inovace a zkvalitnění výuky prostřednictvím ICT Databázové systémy MySQL základní pojmy, motivace Ing. Kotásek Jaroslav

5 Přehled operátorů, příkazy, přetypování

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

Dotazy v SQL. Výraz relační algebry R1( )[A1,A2,...,Aj] lze zapsat takto: SELECT A1,A2,...,Aj FROM R1 WHERE. Výraz (R1, R2... Rk)( )[A1,A2,...

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

SQL v14. 4D Developer konference. 4D Developer conference 2015 Prague, CZ Celebrating 30 years

Transkript:

6. blok část B Vnořené dotazy Studijní cíl Tento blok je věnován práci s vnořenými dotazy. Popisuje rozdíl mezi korelovanými a nekorelovanými vnořenými dotazy a zobrazuje jejich použití. Doba nutná k nastudování 2-3 hodiny Průvodce studiem Při studiu tohoto bloku se předpokládá, že čtenář je obeznámen se základní syntaxí příkazu, spojováním tabulek, použitím vyhledávacích podmínek a základních funkcí. 1. Vnořené dotazy Pod pojmem vnořený dotaz rozumíme příkaz, který je vnořen do jiného SQL dotazu. Při provádění SQL dotazu se nejdříve provede vnořený dotaz. Výsledek vnořeného dotazu je po dokončení celého dotazu zahozen. Vnořený dotaz můžeme chápat jako virtuální tabulku definovanou příkazem. Vnořený dotaz je zapisován do jednoduchých závorek a je možné jej využít v těchto částech dotazu: za klauzulí FROM za klauzulí WHERE za klauzulí HAVING bezprostředně za příkazem Nejčastěji jsou vnořené dotazy používány za klauzulí WHERE u příkazů, UPDATE nebo DELETE. Časté použití je také za klauzulí SET u příkazu UPDATE. Vnořené dotazy, které obsahují alias, jsou označovány jako in-line pohledy. 2. Korelované vnořené dotazy Korelované neboli souvztažné vnořené dotazy jsou takové, které obsahují reference na nadřazený dotaz. Korelovaný vnořený dotaz je spouštěn pro každý řádek nadřazeného dotazu. Pro lepší pochopení si ukážeme použití na příkladu. 1

Zjistěte počty nabízených produktů od jednotlivých dodavatelů. nazev, ( COUNT(*) WHERE produkty.dodavatel_id=dodavatele.dodavatel_id ) FROM dodavatele; Podívejme se podrobněji na vnořený dotaz. Za klauzulí WHERE používáme odkaz na tabulku DODAVATELE, která však figuruje až v nadřazeném dotazu. Pro každý řádek z tabulky DODAVATELE je tedy vnořený dotaz spuštěn znovu. Celý tento příklad by bylo možné nahradit použitím konstrukce GROUP BY. Další možností využití korelovaných vnořených dotazů je test existence relací. K tomuto účelu slouží operátor EXISTS. Ukažme si na příkladu. Z tabulky produkty vypište ty produkty, kde dodavatel dodá ještě i jiné produkty. prod1. prod1. prod1. prod1 WHERE EXISTS( prod2.produkt_id prod2 WHERE prod1.dodavatel_id = prod2.dodavatel_id AND prod1.produkt_id <> prod2.produkt_id ); Výsledkem dotazu jsou ty řádky tabulky PRODUKTY, kde existuje alespoň jeden řádek z vnořeného dotazu. Jelikož je vnořený i nadřazený dotaz prováděn nad stejnou tabulkou, je nutné použít alias. Bez použití aliasů databázový systém 2

nerozpozná, které hodnoty má porovnávat. Vnořené dotazy opatřené aliasem se nazývají in-line pohledy a budeme se jimi zabývat později. Použití korelovaných vnořených dotazů je možné v některých případech nahrazovat souhrnnými dotazy. V některých případech je jednodušší ale použít vnořené dotazy, protože se můžeme vyhnout spojování tabulek. 3. Nekorelované vnořené dotazy Nekorelované vnořené dotazy neobsahují žádnou referenci na nadřazený dotaz. Na rozdíl od korelovaných vnořených dotazů jsou provedeny pouze jednou. Nekorelované vnořené dotazy můžeme rozdělit do kategorií, podle typu návratové množiny: Jednořádkové, jednosloupcové Víceřádkové, jednosloupcové Víceřádkové, vícesloupcové 3.1. Jednořádkové, jednosloupcové vnořené dotazy Jsou vnořené dotazy, které vrací jeden řádek a jeden sloupec. V literatuře jsou označovány jako skalární vnořené dotazy, protože tyto dotazy je možné porovnávat běžnými operátory (=, <, >,!=, <=, >=). Skalární vnořené dotazy jako jediné umožňují použití bezprostředně za příkazem. Z tabulky produkty zobrazte všechny produkty, které mají zadanou cenu. Ve výstupu zobrazte oznaceni a rozdíl mezi maximální cenou všech produktů a cenou aktuálního produktu. ( MAX() )- rozdil_od_nejdrazsiho WHERE IS NOT NULL; 3

Dotaz je vyhodnocen tak, že nejdříve je proveden vnořený dotaz a od této hodnoty je v každém řádku odečtena produktu. Z tabulky produkty zobrazte všechny produkty, které mají cenu vyšší než je průměrná všech produktů. WHERE > ( AVG() WHERE IS NOT NULL ); 3.2. Víceřádkové, jednosloupcové vnořené dotazy Jakmile vnořený dotaz vrátí více než jeden řádek, není možné použít běžné porovnávací operátory. Není totiž možné porovnat jednu hodnotu přímo s množinou hodnot. Můžeme ale porovnat danou hodnotu s každou hodnotou v množině. K tomu slouží operátory ANY a ALL. Ukažme si na příkladu. 4

Z tabulky produkty zobrazte všechny produkty, které mají cenu vyšší než alespoň jeden další produkt. WHERE > ANY( WHERE IS NOT NULL ); Operátor ANY pracuje tak, že podmínka je vyhodno jako pravdivá, pokud je hodnota větší (pro náš příklad) než alespoň jedna hodnota z množiny. Z tabulky produkty zobrazte všechny produkty, které mají cenu vyšší nebo stejnou než všechny ostatní produkty. WHERE >= ALL( WHERE IS NOT NULL ); Při použití operátoru ALL je podmínka pravdivá jedině tehdy, pokud je hodnota větší nebo rovna než všechny hodnoty z množiny. 5

3.3. Víceřádkové, vícesloupcové vnořené dotazy Zatímco u předchozích příkladů jsme porovnávali vždy jeden sloupec s výsledkem vnořeného dotazu, vícesloupcové vnořené dotazy umožňují porovnávání více sloupců najednou. Pro porovnávání více sloupců zároveň musíme využít konstruktoru řádkové hodnoty. Syntaxe konstruktoru řádkové hodnoty vypadá následovně: (<název sloupce>, <název sloupce>, <název sloupce>) Takto konstruovaný výraz můžeme porovnat pomocí operátoru =, pokud jsme si jisti, že se vrátí pouze jeden řádek. Nebo pomocí operátoru IN. Práci s vícesloupcovými vnořenými dotazy si ukážeme na příkazu UPDATE. Změňte všechny řádky v tabulce PRODUKTY, které nemají zadanou cenu ani dodavatele. Takovým sloupcům uveďte do pole oznaceni řetězec Průměr a do pole průměrnou cenu všech produktů. UPDATE produkty SET ( ) = ( 'Průměr', AVG() ) WHERE dodavatel_id IS NULL AND IS NULL; * ; U tohoto příkladu jsme předpokládali, že v tabulce PRODUKTY je pouze jeden produkt, který obsahuje ve sloupcích dodavatel_id a hodnotu NULL. Kdyby tomu tak nebylo, skončí příkaz UPDATE chybovým hlášením. 6

4. In-line pohledy In-line pohled je vnořený dotaz, který má alias. Využití in-line pohledů se nabízí pro zjednodušení komplexních dotazů odstraněním spojení tabulek (operací JOIN). Umožňuje také spojení několika samostatných dotazů do jednoho. 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ů si ukážeme na jednoduchém příkladu. vproduktydodavatele.nazev, ROUND(AVG(vProduktyDodavatele.),2) as prumerna_ FROM ( dodavatele.nazev, produkty. produkty. dodavatele.dodavatel_id, produkty. FROM dodavatele JOIN produkty ON produkty.dodavatel_id = dodavatele.dodavatel_id ) vproduktydodavatele GROUP BY vproduktydodavatele.nazev; 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. produkty. dodavatele.dodavatel_id, produkty. FROM dodavatele JOIN produkty ON produkty.dodavatel_id=dodavatele.dodavatel_id WITH READ ONLY; 7

vproduktydodavatele.nazev, ROUND(AVG(vProduktyDodavatele.),2) as prumerna_ FROM vproduktydodavatele GROUP BY vproduktydodavatele.nazev; 5. Případ použití vnořených dotazů návrat prvních N řádků V mnoha případech je třeba získat pouze určitý počet řádků z výsledku. Například pokud chceme 3 nejdražší produkty. Taková konstrukce není přímo v SQL implementována a různé databázové systémy mají vlastní mechanismy jak výsledku docílit. V prostředí databázového systému Oracle je problém řešen kombinací pseudosloupce ROWNUM a vnořených dotazů. Ukažme si tedy použití na příkladu. Zobrazte první 3 nejdražší produkty. FROM ( WHERE IS NOT NULL ORDER BY DESC ) WHERE rownum <= 3; 8

Pojmy k zapamatování Příkazy a funkce: kostrukce FROM ( ), UPDATE SET ()=(), WHERE () IN () Problém: užití korelovaných a nekorelovaných vnořených dotazů Shrnutí V této lekci jste se seznámili s použitím vnořených dotazů. Vnořené dotazy dělíme na korelované a nekorelované. Korelované vnořené dotazy obsahují reference na vnější dotaz. Vnořené dotazy mohou být jednosloupcové, jednořádkové (skalární), jednosloupcové, víceřádkové a vícesloupcové, víceřádkové. Otázky na procvičení 1. Co je nekorelovaný vnořený dotaz? 2. Čím můžeme nahradit souhrnné funkce? 3. Co znamená pojem in-line pohled? 4. Jaké operátory můžeme použít u jednořádkových, jednosloupcových vnořených dotazů? 5. Co je konstruktor řádkové hodnoty a k čemu slouží? Odkazy a další studijní prameny http://www.techonthenet.com/oracle (syntaxe příkazů SQL jazyka a funkcí) http://www.sqlcourse.com (interaktivni SQL trénink) http://www.oracle.com/technetwork/database/enterpriseedition/documentation (dokumentace k databázové platformě Oracle) http://www.penguin.cz/noviny/?id=chip/index (seriál Databáze standardu SQL z časopisu CHIP) Odkazy a další studijní prameny ŠIMŮNEK, M. SQL, kompletní kapesní průvodce. Grada Publishing, 1999. ISBN 80-7169-692-7. STEPHENS, K.R., PLEW, R.R. Naučte se SQL za 21 dní. Praha: Computer Press, 2004. ISBN 80-7226-870-8. GROFF, J.R., WEINBERG, P.N. SQL - kompletní průvodce. Praha: Computer Press, 2005. ISBN 80-251-0369-2. 9