Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115 Číslo projektu: Číslo šablony: Název materiálu: Ročník: Identifikace materiálu: Jméno autora: Předmět: Tématický celek: Anotace: CZ.1.07/1.5.00/34.0410 V/2 - inovace směřující k rozvoji odborných kompetencí Pracovní listy Databáze 3. ročník (IT) BEL_52_DAT_PL9 Miloslav Bělský Databáze Výběrový dotaz Obsahem tohoto pracovního listu je spojování tabulek pomocí klauzule JOIN. Datum: 12. 11. 2013 9-1
Databáze Pracovní list č. 9 Spojování tabulek Cíl Naučit se vytvářet dotazy nad více tabulkami a získávat tak komplexní informace z databáze. Spojovat tabulky s ohledem na požadovaný výsledek. Výklad Proč spojujeme tabulky Chceme-li získat ucelenou informaci z databáze, často to znamená získat data z několika tabulek a spojit je dohromady. V každé tabulce ukládáme totiž informace pouze o jedné věci. Např: V tabulce Zákazníci máme uložené osobní údaje o jednotlivých zákaznících, v tabulce Objednávky ukládáme objednávky každého zákazníka. Pokud budeme chtít získat všechny objednávky konkrétního zákazníka, musíme spojit správná data z obou tabulek. Tabulky jsou logicky pospojovány pomocí tzv. cizích klíčů, které ukazují, se kterým řádkem cílové tabulky je daný řádek zdrojové tabulky spojen. Rozeznáváme dva typy spojení tabulek: INNER JOIN pracuje pouze s řádky, které ve spojovacím sloupci nemají NULL. OUTER JOIN pracuje se všemi řádky, bez ohledu na hodnoty ve spojovacím sloupci. Tabulkové aliasy a úplné názvy sloupců Pro zjednodušení a přehlednost dotazů při spojování tabulek je dobré využívat tzv. tabulkové aliasy. Ty můžeme definovat v části FROM podobně jako aliasy sloupců bez klíčového slova AS. Např....FROM zamestnanci zam, oddeleni o... Protože se v části SELECT budou vyskytovat sloupce z několika tabulek a může dojít ke shodě jména, je potřeba sloupce pojmenovat úplným názvem: tabulka.sloupec: např. zamestnanci.plat nebo s využitím tabulkových aliasů: z.plat, o.nazev atd. 9-2
Syntaxe a typy spojení Na základě struktury a pojmenování spojovacího sloupce v tabulkách můžeme použít následující syntaxi: CROSS JOIN je spojení tabulek, které neposkytuje smysluplné informace. Výsledkem je kombinace všech řádků první tabulky se všemi řádky druhé tabulky, resp. třetí, čtvrté, atd. Syntax: SELECT seznam_sloupců FROM tabulka1, tabulka2,... Pokud bude tabulka1 obsahovat 10 řádků a tabulka2 5 řádků, výsledný dotaz vrátí 5x10=50 řádků (kombinace všech řádků tabulky1 se všemi řádky tabulky2). NATURAL JOIN Toto spojení můžeme použít, jestliže tabulky obsahují právě jeden spojovací sloupec, který je v obou tabulkách stejně pojmenovaný a který je stejného datového typu, můžeme použít. FROM t1 NATURAL JOIN t2 Tento dotaz připojí ke každému řádku jedné tabulky správný řádek druhé tabulky podle hodnoty ve spojovacím sloupci. JOIN USING Pokud je ve spojovaných tabulkách více stejně pojmenovaných sloupců, nelze použít NATURAL JOIN. Můžeme ale specifikovat spojovací sloupec užitím klauzule USING. FROM t1 JOIN t2 USING (spojovací_sl); JOIN ON Není-li spojovací sloupec pojmenován shodně v obou tabulkách, musíme využít kompletní syntaxi klauzule JOIN ON a zapsat spojovací podmínku. FROM tabulka1 t1 JOIN tabulka2 t2 ON (t1.sloupec = t2.sloupec); Tento dotaz provede spojení tabulek a přiřadí k sobě příslušné řádky podle spojovací podmínky. SELF JOIN je zvláštním případem spojení, kde spojujeme tabulku samu se sebou. SELF JOIN přichází v úvahu, pokud je v tabulce např. definován rekurzivní vztah. To je častý případ 9-3
tabulek, které uchovávají informace o zaměstnancích, a rekurzivním vztahem určujeme nadřízené a podřízené. V tomto případě je naprosto nutné použít tabulkové aliasy, aby se od sebe odlišily jednotlivé kopie tabulky. FROM tabulka1 t1 JOIN tabulka2 t2 ON (t1.sloupec = t2.sloupec); Jak vidno, syntaxe je jinak naprosto stejná jako u klasického spojení. OUTER JOIN Všechny doposud zmíněné případy byly varianty tzv. INNER JOINů. Pokud neuvedete slovo OUTER, vždy se jedná o INNER JOIN. OUTER JOIN může být LEFT, RIGHT nebo FULL. Vždy musíme uvádět, který typ chceme použít. Jak už bylo uvedeno, OUTER JOIN zpracuje i řádky tabulek, které nemají hodnotu ve spojovacím sloupci. LEFT OUTER JOIN ve výsledku uvidíme všechny řádky tabulky, která byla uvedena nalevo od klauzule JOIN. RIGHT OUTER JOIN ve výsledku uvidíme všechny řádky tabulky, která byla uvedena napravo od klauzule JOIN. FULL OUTER JOIN ve výsledku budou všechny řádky obou tabulek ve spojení. FROM tabulka t1 (LEFT RIGHT FULL) OUTER JOIN tabulka t2 ON (t1.sloupec = t2.sloupec) Poznámky na závěr Lze spojovat dvě a více tabulek. Syntaxe se pouze rozšíří o další klauzuli JOIN. FROM tabulka1 t1 JOIN tabulka2 t2 ON (t1.sloupec = t2. sloupec) JOIN tabulka3 t3 ON (t2.sloupec = t3.sloupec) Používejte tabulkové aliasy, dotazy se významně zkrátí a zpřehlední. Dobře si prohlédněte tabulky a ujistěte se, který sloupec propojuje tabulky. A jestli tím získáte hodnoty, které potřebujete. 9-4
Příklady k procvičení Vytvářejte dotazy podle následujícího zadání. Příklady označené jsou velmi obtížné. Pod každým úkolem je prostor na poznámky: 1. Ověřte si libovolným dotazem, jaký výsledek získáte CROSS JOINem. 2. Vypište všechny zaměstnance a název jejich pozice. Výsledek seřaďte podle názvu pozice a poté podle příjmení (EMPLOYEES, JOBS). 3. Vypište příjmení zaměstnanců a název oddělení, ve kterém pracují. Chceme vidět zaměstnance bez přiděleného oddělení a oddělení bez přidělených zaměstnanců. 4. Vypište jméno, příjmení, datum nástupu a název oddělení zaměstnanců, kteří nastoupili po 1.1.1999 (EMOLOYEES, DEPARTMENTS) 5. Vypište zaměstnance z oddělení IT a jména jejich nadřízeného pracovníka (EMPLOYEES). Chceme vidět i zaměstnance, kteří nemají nadřízené. 6. Vypište adresu a město z tabulky LOCATIONS. U každého záznamu vypište název příslušné země a regionu. (LOCATIONS, REGIONS, COUNTRIES) 7. Vypište záznamy z tabulky D_EVENTS. Každý odkaz do jiné tabulky nahraďte názvem nebo jménem z příslušné tabulky. 8. Vypište jména a adresy všech zaměstnanců. U každého zaměstnance vypište také jméno oddělení, jméno nadřízeného a název pozice, na které pracuje (EMPLOYEES, DEPARTMENTS, JOBS) 9. Vypište seznam všech skladeb, které budou hrány na události číslo 100. Vypište název skladby, adresu místa konání a komentář. (D_PLAY_LIST_ITEM, D_SONGS, D_EVENTS) 10. Vypište jména, příjmení a platy zaměstnanců. U každého vypište, do jaké skupiny podle platu patří. Seřaďte výsledky podle označení skupiny, poté podle výše platu sestupně a poté podle příjmení (EMPLOYEES, JOB_GRADES) 9-5