PEDNKA 7 SQL JOIN Spojen tabulek JOIN Spojen
PŘEDNÁŠKA 7 SQL – JOIN
Spojení tabulek JOIN • Spojení tabulek v SQL dotazu může být realizováno více způsoby. • Různé dotazy JOIN mohou navíc dle svých vlastností vracet odlišné výsledky. • SQL podporuje kromě čárkových spojení (minulá přednáška) také přímou klauzuli JOIN. • Zaměříme se především na (podpora My. SQL): • Vnitřní spojení INNER JOIN • Levé vnější spojení LEFT OUTER JOIN • Přirozené spojení NATURAL JOIN
Přehled typů spojení SELECT atributy 1 FROM tab 1, tab 2 WHERE tab 1. xx = tab 2. yy Čárkové spojení 2 FROM tab 1 JOIN tab 2 ON tab 1. xx = tab 2. yy Vnitřní spojení (doplní INNER) 3 FROM tab 1 CROSS JOIN tab 2 ON tab 1. xx = tab 2. yy Křížové spojení 4 FROM tab 1 INNER JOIN tab 2 ON tab 1. xx = tab 2. yy Vnitřní spojení 5 FROM tab 1 STRAIGHT_JOIN tab 2 Přímé spojení 6 FROM tab 1 LEFT JOIN tab 2 ON tab 1. xx = tab 2. yy Levé vnější spojení 7 FROM tab 1 LEFT JOIN tab 2 USING xy 8 FROM tab 1 NATURAL JOIN tab 2 Přirozené spojení 9* FROM tab 1 RIGHT JOIN tab 2 USING xy Pravé vnější spojení 10° FROM tab 1 FULL JOIN tab 2 * Nepodporují některé DB systémy ° Nepodporuje My. SQL Plné vnější spojení
Vnitřní spojení INNER JOIN • Vnitřní spojení INNER JOIN je ekvivalentní čárkovému spojení. • Slovo INNER je nepovinné. Pokud v dotazu uvedeme pouze JOIN, My. SQL jej automaticky považuje za INNER JOIN! • INNER JOIN spojí dvě tabulky podle podmínky spojení. • Podmínka spojení se uvádí za klíčovým slovem ON. Hlavní charakteristika • Vnitřní spojení vrací pouze ty řádky, které mají odpovídající si záznamy v obou tabulkách (shodu na spojovaných sloupcích). SELECT … FROM tab 1 INNER JOIN tab 2 ON tab 1. x = tab 2. y
Ukázka auta: automobilky: id znacka_id nazev znacka_id znacka 1 10 Rapid 10 Škoda 2 10 Octavia 20 Audi SELECT automobilky. znacka, auta. nazev FROM auta INNER JOIN automobilky ON auta. znacka_id = automobilky. znacka_id Výsledek: znacka nazev Škoda Rapid Škoda Octavia
Příklad INNER JOIN • Chceme získat tabulku vozů, spolu s názvem automobilky: SELECT am_nazev AS Znacka, au_nazev AS Vozidlo FROM auta INNER JOIN automobilky ON auta. am_id = automobilky. am_id • Na pořadí tabulek v tomto dotazu nezáleží. Všimněte si, že Mazda nemá v tabulce auta odpovídající záznam, tudíž není v INNER JOIN akceptována.
Příklad INNER JOIN • Chceme získat všechny auta, které mají diesel o obsahu 2. 0 litru. SELECT au_nazev, typ, obsah FROM auta INNER JOIN auto_motor ON auta. au_id = auto_motor. au_id INNER JOIN motory ON auto_motor_id = motory. motor_id WHERE typ = 'D' AND obsah = 2000
Levé vnější spojení LEFT JOIN • Celým názvem LEFT OUTER JOIN. Slovo OUTER je nepovinné. • LEFT JOIN spojí dvě tabulky podle podmínky spojení. • Podmínka spojení se uvádí za klíčovým slovem ON. Hlavní charakteristika • Levé vnější spojení vrací všechny řádky z první tabulky, i když nemají odpovídající záznam v tabulce druhé. Chybějící hodnoty se doplní NULL.
Ukázka 1 auta: automobilky: id znacka_id nazev znacka_id znacka 1 10 Rapid 10 Škoda 2 10 Octavia 30 Audi SELECT znacka, nazev FROM automobilky LEFT JOIN auta ON auta. znacka_id = automobilky. znacka_id Výsledek: znacka nazev Škoda Rapid Škoda Octavia Audi Null
Ukázka 2 auta: automobilky : id cizi_klic nazev id znacka 1 10 Rapid 10 Škoda 2 10 Octavia 30 Audi 3 20 Golf SELECT znacka, nazev FROM auta LEFT JOIN auta ON auta. znacka_id = automobilky. znacka_id Výsledek: znacka nazev Škoda Rapid Škoda Octavia Null Golf
Příklad LEFT JOIN • Chceme získat názvy všech automobilek a jejich vozů: SELECT am_nazev, GROUP_CONCAT( au_nazev SEPARATOR ', ' ) AS vozy FROM automobilky LEFT JOIN auta ON automobilky. am_id = auta. am_id GROUP BY automobilky. am_id • Poznámka: Pokud bychom použili vnitřní spojení, Mazda by se ve výsledku neobjevila. Protože nemá odpovídající záznam v tabulce auta.
Příklad LEFT JOIN • Chceme získat všechny vozy s příslušnými motory. SELECT au_nazev, typ, obsah FROM auta LEFT JOIN auto_motor ON auta. au_id = auto_motor. au_id LEFT JOIN motory ON auto_motor_id = motory. motor_id
NATURAL JOIN • Přirozené spojení funguje principiálně stejně jako vnitřní spojení. • Používá se tehdy, pokud spojované sloupce mají SHODNÝ název. • Odpadá poté nutnost uvádět podmínku spojení za ON. • My. SQL spojí tabulky v dotazu sám.
NATURAL JOIN • Uvažujme první příklad. • Spojujeme tabulky automobilky a auta. Spojujeme na sloupcích, které mají shodný název am_id. • Dotaz s NATURAL JOIN vypadá následovně: SELECT am_nazev AS Znacka, au_nazev AS Vozidlo FROM auta NATURAL JOIN automobilky • Výsledek bude stejný jako s INNER JOIN.
Zapamatujte si • Dotazy spojení JOIN • Typy JOIN dotazů • Vnitřní spojení INNER JOIN • Levé vnější spojení LEFT JOIN • Přirozené spojení NATURAL JOIN • Charakteristiky jednotlivých typů spojení
- Slides: 15