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 MySQL): Vnitřní spojení INNER JOIN Levé vnější spojení LEFT OUTER JOIN Přirozené spojení NATURAL JOIN
Přehled typů spojení SELECT atributy 1 2 3 4 5 6 7 8 9* 10° FROM tab1, tab2 WHERE tab1.xx = tab2.yy Čárkové spojení 2 FROM tab1 JOIN tab2 ON tab1.xx = tab2.yy Vnitřní spojení (doplní INNER) 3 FROM tab1 CROSS JOIN tab2 ON tab1.xx = tab2.yy Křížové spojení 4 FROM tab1 INNER JOIN tab2 ON tab1.xx = tab2.yy Vnitřní spojení 5 FROM tab1 STRAIGHT_JOIN tab2 Přímé spojení 6 FROM tab1 LEFT JOIN tab2 ON tab1.xx = tab2.yy Levé vnější spojení 7 FROM tab1 LEFT JOIN tab2 USING xy 8 FROM tab1 NATURAL JOIN tab2 Přirozené spojení 9* FROM tab1 RIGHT JOIN tab2 USING xy Pravé vnější spojení 10° FROM tab1 FULL JOIN tab2 Plné vnější spojení * Nepodporují některé DB systémy ° Nepodporuje MySQL
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, MySQL 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 tab1 INNER JOIN tab2 ON tab1.x = tab2.y
Ukázka auta: automobilky: SELECT automobilky.znacka, auta.nazev FROM auta INNER JOIN automobilky ON auta.znacka_id = automobilky.znacka_id Výsledek: id znacka_id nazev 1 10 Rapid 2 Octavia znacka_id znacka 10 Škoda 20 Audi znacka nazev Škoda Rapid 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.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: SELECT znacka, nazev FROM automobilky LEFT JOIN auta ON auta.znacka_id = automobilky.znacka_id Výsledek: id znacka_id nazev 1 10 Rapid 2 Octavia znacka_id znacka 10 Škoda 30 Audi znacka nazev Škoda Rapid Octavia Audi Null
Ukázka 2 auta: automobilky : SELECT znacka, nazev FROM auta LEFT JOIN auta ON auta.znacka_id = automobilky.znacka_id Výsledek: id cizi_klic nazev 1 10 Rapid 2 Octavia 3 20 Golf id znacka 10 Škoda 30 Audi znacka nazev Škoda Rapid 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.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. MySQL 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í