Spojení dvou tabulek
Spojení (anglicky join) dá dohromady řádky dvou tabulek. Tady je otázka z minulého cvičení, kdo zadal kterou objednávku, zodpovězená pro všechny objednávky najednou:
SELECT objednavky.id, datum, jmeno
FROM objednavky
JOIN zakaznici ON objednavky.zakaznik_id = zakaznici.id
ORDER BY objednavky.id;| id | datum | jmeno |
|---|---|---|
| 1 | 2024-01-20 | Eva Novotná |
| 2 | 2024-02-14 | Jakub Dvořák |
| 3 | 2024-02-29 | Tereza Svobodová |
| 4 | 2024-03-15 | Eva Novotná |
| … | … | … |
JOIN zakaznici (spoj s tabulkou zakaznici) přidá do dotazu tabulku zakaznici a podmínka za ON říká, které řádky k sobě patří: objednávka patří k zákazníkovi, jehož id se rovná jejímu zakaznik_id. Je to cizí klíč z minulého cvičení, jen ho teď místo vás sleduje databáze. objednavky.zakaznik_id je sloupec zakaznik_id tabulky objednavky: název tabulky, tečka a název sloupce. Sloupec id mají obě tabulky, a tak musíte říct, čí id myslíte, v ON i v SELECT. Víc se o tom dozvíte v dalším cvičení.
Jak databáze dvojice najde? Představte si to takhle: prochází řádky tabulky objednavky jeden po druhém a ke každému hledá v tabulce zakaznici řádky, pro které podmínka platí. Každá nalezená dvojice se stane jedním řádkem výsledku, se sloupci obou tabulek vedle sebe, a SELECT pak vybere, které z nich ukázat. Objednávka 1 má zakaznik_id 1, podmínka platí pro řádek Evy Novotné a výsledek dostane řádek s objednávkou 1 a Evou Novotnou. Objednávka 4 má zakaznik_id také 1, takže Eva Novotná je ve výsledku znovu, vedle objednávky 4. Tak to má být: každý zákazník je ve výsledku tolikrát, kolik má objednávek.
A co zákazník, který žádnou objednávku nemá? Filip Beneš si nikdy nic neobjednal: žádná objednávka nemá zakaznik_id 12, jeho id. Jeho řádek nemá s čím vytvořit dvojici, a tak ve výsledku vůbec není. JOIN si nechá jen řádky, které našly protějšek; ostatní zmizí. Pro seznam objednávek je to přesně to, co chcete. Když je potřebujete zachovat, existuje jiný druh spojení, který se naučíte později v této lekci.
Uvidíte také INNER JOIN (vnitřní spojení): je to totéž co JOIN, INNER je jen celý název tohoto druhu spojení. Na pořadí tabulek nezáleží: FROM zakaznici JOIN objednavky ON … najde stejné dvojice. A nezáleží ani na tom, kterou stranu = napíšete první.
Typická chyba: podmínka, která spojuje špatné sloupce. ON objednavky.id = zakaznici.id proběhne bez chyby, ale spáruje objednávku 1 se zákazníkem 1, objednávku 2 se zákazníkem 2 a tak dál, a to nic neznamená. Podmínka spojuje cizí klíč s primárním klíčem, na který ukazuje: tady objednavky.zakaznik_id se zakaznici.id.
Jak psát:
Pokyny
Ukažte recenze s názvy her: spojte tabulku recenze s tabulkou hry (hra_id recenze je id hry) a ukažte sloupce nazev, hvezdicky a komentar. Řádky seřaďte podle nazev a recenze téže hry podle zakaznik_id:
| nazev | hvezdicky | komentar |
|---|---|---|
| Bakery Story | 4 | Roztomilá a klidná. |
| Cube Logic | 3 | NULL |
| Cube Logic | 5 | Ideální do autobusu. |
| Dragon Forge | 4 | Skvělý příběh, jen trochu dlouhý. |
| … | … | … |
Pod něj napište dotaz, který spojí tabulku zakaznici s tabulkou objednavky a ukáže jmeno každého zákazníka s datem každé jeho objednávky (datum), seřazené podle jmeno, potom podle datum. Filip Beneš a Martin Zeman v něm nejsou: nikdy si nic neobjednali.
| jmeno | datum |
|---|---|
| Adéla Králová | 2025-02-14 |
| Adéla Králová | 2025-09-27 |
| Anna Kučerová | 2024-05-11 |
| … | … |
Začněte programovat zdarma
2/12