YDASYS1 Ing. Monika Šimková.

Slides:



Advertisements
Podobné prezentace
Aplikační a programové vybavení
Advertisements

KIV/ZIS Cvičení 6 SQL - SELECT.
MS ACCESS - DOTAZY DATABÁZOVÉ SYSTÉMY.
SQL Další dotazy a pohledy
Základy jazyka SQL Jan Tichava
Aplikační a programové vybavení
Jazyk SQL Ing. Zdena DOBEŠOVÁ. SQL Structured Query Language 1974 SEQUEL (Structured English Query Language) neprocedurální relační dotazovací jazyk norma.
DB1 – 9. cvičení Optimalizace dotazu Konkurenční přístup a deadlock Indexace Transakce.
Databázové systémy SQL Výběr dat.
Fakulta elektrotechniky a informatiky
Informační systémy Realizace uložených procedur a spouští, jejich praktické využití.
Informační systémy Nástroje pro sběr dat, návrh a realizace databáze.
AGREGACE Distinct, Group By, Having, SUM, …. DISTINCT  Slučování stejných řádků ve výsledku dotazu. AGREGACE 2 JménoPříjmeníID FrantišekVomáčka1 JosefPokorný2.
Další dotazy SQL Structured Query Language. Některé SQL příkazy mohou mít v sobě obsaženy další kompletní příkazy SELECT. Využijeme je tam, kde potřebujeme.
SQL Structured Query Language
Informatika pro ekonomy II přednáška 11
Architektury a techniky DS Tvorba efektivních příkazů I Přednáška č. 3 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Databázové systémy 1 Cvičení č. 6 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Databázové systémy 1 Cvičení č. 4 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Databázové systémy I Přednáška č. 5 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Databázové systémy 1 Cvičení č. 3 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Temporální Databáze Jaroslav Dražan. Čím se budeme zabývat Proč je čas v DB důležitý Práce s časem pomocí klasického SQL Reprezentace časové domény Spojování.
Martin Kirschbaum 4.A,  určitá uspořádaná množina informací (dat) uložená na paměťovém médiu  Databázový program - umožňuje tvořit, editovat,
SQL Přednáška DB1. Literatura CONNOLLY, T.M.-BEGG,C.E.-STRACHAN,A.D.: Database Systems – A Practial Approach to Design, Implementation and Management.
MySQL - Vytvoření nové tabulky  create table jméno_tabulky (jméno_položky typ_položky,... ) Přehled nejběžnějších datových typů Přehled nejběžnějších.
Databázové systémy II Přednáška č. 8 – Pohledy (Views)
Školení správců II. Petr Pinkas RNDr. Vít Ochozka.
Cvičení 04 SQL Exists, Any, All Ing. Pavel Bednář
Databázové systémy II Přednáška č. 9 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Fakulta elektrotechniky a informatiky
Databázové systémy I Cvičení č. 9 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
KIV/ZIS cvičení 6 Tomáš Potužák. Pokračování SQL Klauzule GROUP BY a dotazy nad více tabulkami Stáhnout soubor studenti_dotazy_sql.mdb.
Informatika pro ekonomy II přednáška 10
Databázové systémy I Cvičení č. 6 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
Databázové systémy Přednáška č. 6.
SQL – základní pojmy Ing. Roman Danel, Ph.D.
SQL PVA Jan Hora. SQL „graficky“ Grafický vs. pravý SQL SELECT ORDED BY WHERE.
Rauer Luboš Kopic Petr Blažek Tomáš. Structured Query Language - dotazovací jazyk -> pracuje s dotazy - neprocedurální jazyk - mocný, ale přitom jednoduchý.
Fakulta elektrotechniky a informatiky
Číslo šablony: III/2 VY_32_INOVACE_P4_3.8 Tematická oblast: Aplikační software pro práci s informacemi II. Databáze – základy SQL Typ: DUM - kombinovaný.
Databázové systémy I Cvičení č. 10 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
Databázové systémy Tomáš Skopal
Databázové systémy I Cvičení č. 7 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
Informatika II PAA DOTAZOVACÍ JAZYKY
Aplikační a programové vybavení
Databázové systémy Informatika pro ekonomy, př. 18.
Databáze velké množství dat pevně dané struktury
Obchodní akademie, Ostrava-Poruba, příspěvková organizace Vzdělávací materiál/DUM VY_32_INOVACE_01B13 Autor Ing. Jiří Kalousek Období vytvoření březen.
Databázové systémy SQL Výběr dat.
 Agregační funkce  Agregační funkce jsou to funkce, které nějakým způsobem zpracují více hodnot a jako výsledek vrátí hodnotu jednu COUNT()  Funkce.
SQL Další dotazy a pohledy Databázové systémy. Některé SQL příkazy mohou mít v sobě obsaženy další kompletní příkazy SELECT. Využijeme je tam, kde potřebujeme.
CUBE - Operátor relační agregace
J. Pokorný, I Halaška1 DBS: SQL92 Jaroslav Pokorný MFF UK, Praha
SQL Structured Query Language
Databázové systémy I Cvičení č. 8 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2015.
J. Macur, FAST VUT, 2011 (kombinované studium BU04)
Databázové systémy I Přednáška č. 6 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Příkazy jazyka SQL ve VFP a na SQL Serveru
SQL – příkaz SELECT Ing. Roman Danel, Ph.D.
Databázové systémy I Přednáška 5 Databázové systémy 1 – KIT/IDAS1
Databázové systémy I Přednáška 8 Databázové systémy 1 – KIT/IDAS1
Ing. Tomáš Váňa, Ing. Jiří Zechmeister
Databázové systémy a SQL
Informatika pro ekonomy přednáška 8
Optimalizace SQL dotazů
Počítačová cvičení z předmětu Datové sklady
Dotazovací jazyk SQL - II
Přednáška 7 SQL – JOIN.
Přednáška 9 Triggery.
Databázové systémy a SQL
Transkript prezentace:

YDASYS1 Ing. Monika Šimková

Typy spojení tabulek V mnoha případech potřebujeme do výsledku dotazu získat data sloupců, obsažených v různých tabulkách a proto je nutné tabulky spojit. Jazyk SQL umožňuje vytvoření různých typů spojení: vnitřní spojení (INNER JOIN) – odpovídá přirozenému spojení relací vnější spojení (OUTER JOIN) LEFT OUTER JOIN RIGHT OUTER JOIN FULL OUTER JOIN křížové spojení (CROSS JOIN) – odpovídá kartézskému součinu relací

Syntaxe dotazu na spojené tabulky SELECT {jménoSloupce} [,...] FROM { jménoTabulky I jménoPohledu } [[ INNER | { LEFT | RIGHT | FULL } OUTER] JOIN { jménoTabulky I jménoPohledu } ON VyhledávacíPodmínky ] [,...n] JOIN definuje spojované tabulky ON udává propojovací sloupce tabulek Je-li uveden pouze JOIN, vykoná se INNER JOIN

Alternativní syntaxe vnitřního spojení tabulek Dotaz se spojením tabulek lze zapsat i bez použití klauzule JOIN a ON. Tabulky uvedeme v klauzuli FROM jako seznam oddělený čárkami a spojovací podmínku uvedeme v klauzuli WHERE. SELECT {jménoSloupce} [,...] FROM { jménoTabulky} [,...] WHERE spojovacíPodmínky

Příklad: Spojení 2 tabulek Vytvořte seznam titulů, kde bude uveden název vydavatele a název vydaných titulů - seřazeno dle vydavatele a názvu titulu. SELECT vydavatele.vyd_nazev, tituly.nazev FROM vydavatele INNER JOIN tituly ON vydavatele.vyd_id = tituly.vyd_id ORDER BY vydavatele.vyd_nazev, tituly.nazev Poznámky: INNER nemusíme uvádět (předpokládá se implicitně) Názvy tabulek lze v klauzuli FROM pro účely příkazu přejmenovat (zkrátit) a tím zpřehlednit příkaz.

Příklad: Použití ALIAS Předchozí příkaz lze za použití ALIAS zapsat následovně: SELECT V.vyd_nazev, T.nazev FROM vydavatele V INNER JOIN tituly T ON V.vyd_id = T.vyd_id ORDER BY V.vyd_nazev, T.nazev Poznámka: V klauzuli FROM byla tabulka vydavatele přejmenována na tabulku V a tabulka tituly na tabulku T. V ostatních částech příkazu proto musíme použít nový název tabulek.

Příklad: Spojení 2 tabulek a group by (1) Kolik titulů vydali jednotliví vydavatelé? Ve výsledku uveďte název vydavatele a počet vydaných titulů. SELECT V.vyd_nazev, COUNT(T.nazev) AS Pocet_titulu FROM tituly T INNER JOIN vydavatele V ON T.vyd_id = V.vyd_id GROUP BY V.vyd_nazev Kolik je autorů jednotlivých žánrů (typů)? select typ, count (distinct AT.au_id) from autor_titul AT join tituly T on AT.titul_id= T.titul_id group by T.typ

Příklad: Spojení 2 tabulek a group by (2) Kolik titulů jednotlivých typů vydali jednotliví vydavatelé? Ve výsledku uveďte název vydavatele, typ a počet vydaných titulů. SELECT V.vyd_nazev, typ, COUNT(T.nazev) AS Pocet_titulu FROM tituly T JOIN vydavatele V ON T.vyd_id = V.vyd_id GROUP BY V.vyd_nazev, typ ORDER BY V.vyd_nazev

Příklad: Spojení 2 tabulek a group by (3) Kolik autorů mají jednotlivé tituly? Ve výsledku uveďte název titulu a počet autorů select AT.titul_id, T.nazev, count (AT.au_id) PocetAutoru from autor_titul AT join tituly T on AT.titul_id = T.titul_id group by AT.titul_id, T.nazev

Příklad: Spojení více tabulek Zobrazte následující údaje potřebné pro výpis řádků faktury: číslo faktury, identifikace titulu, název titulu, příjmení a jméno 1. autora titulu, objednané množství, dodané množství

Příklad: Spojení více tabulek - rešení SELECT DISTINCT RO.faktura_id, RO.mnozstviObj, RO.mnozstviDodane, RO.titul_id, T.nazev, A.au_id, AT.poradiAut, A.au_prijmeni, A.au_jmeno FROM radekObjednavky RO INNER JOIN tituly T ON RO.titul_id = T.titul_id INNER JOIN autor_titul AT ON T.titul_id = AT.titul_id INNER JOIN autori A ON AT.au_id = A.au_id WHERE (AT.poradiAut = 1) ORDER BY RO.faktura_id, RO.titul_id

Příklad: Spojení tabulky se sebou Zobrazte všechny informace o autorech, kteří bydlí v tomtéž městě. select distinct A1.* from autori A1, autori A2 where A1.mesto = A2.mesto and A1.au_id != A2.au_id order by A1.mesto, A1.au_prijmeni Poznámka: Tabulka vystupuje v příkazu ve dvou rolích a toto umožní porovnávat mezi sebou hodnoty stejného sloupce v rámci jedné tabulky.

Příklad: Použití alternativního klíče Zobrazte jméno a příjmení editorů, kteří jsou zároveň i autory. Pozor: Editoři a autoři jsou v nezávislých tabulkách, proto v dotazu je vhodné použít kandidátní klíč jednoznačně identifikující autora i editora a tím může být například telefonní číslo, případně kombinace jména, příjmení a telefonu (všechny položky by ale měly být nastaveny na NOT NULL). use Nakladatelstvi select ed_id, ed_prijmeni, ed_jmeno from editori, autori where editori.tel = autori.tel

Vnější spojení V některých situacích potřebujeme získat při spojení tabulek všechny řádky jedné nebo obou tabulek bez ohledu na to, zda splňují podmínku spojení. Například můžeme potřebovat seznam všech vydavatelů doplněný o informaci který z editorů bydlí ve stejném městě. Pro tyto případy je možné využít levé, pravé nebo plné vnější spojení.

Příklad: Levé vnější spojení Vytvořte seznam všech vydavatelů doplněný o informaci který z editorů bydlí ve stejném městě. select V.vyd_nazev, E.ed_prijmeni, E.ed_jmeno, E.poziceEd, E.tel, E.mesto from vydavatele V LEFT OUTER join editori E on V.mesto= E.mesto

Příklad: Pravé vnější spojení Vytvořte seznam všech editorů doplněný o informaci který z vydavatelů sídlí ve stejném městě. select V.vyd_nazev, E.ed_prijmeni, E.ed_jmeno, E.poziceEd, E.tel, E.mesto from vydavatele V RIGHT OUTER join editori E on V.mesto= E.mesto

Příklad: Plné vnější spojení select V.vyd_nazev, E.ed_prijmeni, E.ed_jmeno, E.poziceEd, E.tel, E.mesto from vydavatele V FULL OUTER join editori E on V.mesto= E.mesto

Příklad: Vnější spojeni vs. poddotaz Který titul nebyl dosud objednán? select titul_id from tituly where titul_id not in (select titul_id from radekObjednavky) Alternativně: select T.titul_id, nazev, RO.titul_id from tituly T LEFT OUTER JOIN radekObjednavky RO on T.titul_id = RO.titul_id where RO.titul_id IS NULL

Poddotazy Poddotazy představují dotazy vložené dovnitř jiného dotazu, vkládat lze teoreticky do libovolné hloubky. Poddotaz může vrátit jednu hodnotu, kterou lze porovnat s jinou hodnotou v rámci WHERE. Poddotaz může vrátit relaci, kterou lze různě použít v rámci klauzule WHERE. Poddotaz se může použít v rámci klauzule FROM stejně jako každá jiná relace. Poddotazy mohou být použity i v příkazech INSERT, UPDATE, and DELETE. Poddotazy požíváme často v dotazech, které závisí na výsledku jiného dotazu.

Vnořený a souvztažný poddotaz Poddotazy můžeme psát jako vnořené nebo souvztažné (korelované). Vnořený poddotaz se při vykonávání vnějšího dotazu vykoná pouze jednou. Souvztažný poddotaz se při provádění vnějšího dotazu vykoná jednou pro každý navrácený řádek vnějšího dotazu.

Příklad: Vnořený poddotaz Kterých titulů se prodalo více než je průměr a o kolik? SELECT titul_id, nazev, prodanoKs, prodanoKs - (select avg(prodanoKs) from tituly) AS rozdil FROM tituly WHERE prodanoKs > (SELECT avg(prodanoKs) FROM tituly)

Příklad: Vnořený poddotaz – více úrovní Kteří autoři participovali na titulech z oblasti psychologie (typ = ‘psychology’)? Uveďte jméno a příjmení autorů. select au_jmeno, au_prijmeni from autori where au_id in (select au_id from autor_titul where titul_id in (select titul_id from tituly where typ='psychology'))

Pravidla pro použití vnořených poddotazů Poddotaz, který vrací jednu hodnotu, můžeme ve vnějším dotazu zapsat kdekoli na místě výrazu. Do klauzule WHERE můžeme poddotaz zapsat s vhodným operátorem porovnání. V případě, že poddotaz vrací celý sloupec hodnot, můžeme využít operátory IN – na testování příslušnosti k množině hodnot, ALL – na testování, zda všechny hodnoty vrácené poddotazem splňují danou podmínku, ANY – na testování, zda alespoň jedna hodnota vrácená poddotazem splňuje danou podmínku.

Souvztažné poddotazy U souvztažného poddotazu využívá vnitřní dotaz (poddotaz) také informace z vnějšího dotazu, takže se musí provádět zvlášť pro každý jednotlivý řádek vnějšího dotazu. Souvztažné poddotazy se často dají přeformulovat do tvaru spojení tabulek. U operace spojení tabulek dokáže optimalizátor dotazů SQL serveru správně rozhodnout o nejefektivnější realizaci dotazu, takže dotaz se spojenými tabulkami je vhodnější než souvztažný poddotaz.

Operátory EXISTS a NOT EXISTS Pomocí operátorů EXISTS a NOT EXISTS lze snadno omezit výslednou množinu vnějšího dotazu jen na ty řádky, které vyhovují podmínce poddotazu. Jako výsledek tyto operátory produkují pouze true/false True právě tehdy, když existuje alespoň jeden řádek v tabulce, kterou vrátí poddotaz. False právě tehdy, když poddotaz vrátí prázdnou tabulku. Protože EXISTS testuje pouze existenci řádků ve výsledné tabulce poddotazu, výsledek poddotazu může obsahovat libovolný počet sloupců. Vhodné je použití * jako zástupného symbolu.

Příklad: Použití EXISTS Máme najít vydavatele, kteří vydávají tituly typu ‘business’ select distinct vyd_nazev from vydavatele where exists (select * from tituly where tituly.vyd_id = vydavatele.vyd_id and tituly.typ = 'business')