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;
iddatumjmeno
12024-01-20Eva Novotná
22024-02-14Jakub Dvořák
32024-02-29Tereza Svobodová
42024-03-15Eva 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.

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:

nazevhvezdickykomentar
Bakery Story4Roztomilá a klidná.
Cube Logic3NULL
Cube Logic5Ideální do autobusu.
Dragon Forge4Skvě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.

jmenodatum
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

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

2/12