Aliasy tabulek

Ve spojení se názvy tabulek opakují pořád dokola: v ON a před každým sloupcem, který mají obě tabulky. Dotazy jsou pak dlouhé. Proto můžete tabulce dát krátké jméno, alias, hned za jejím názvem ve FROM nebo JOIN. Tohle je dotaz z minulého cvičení s aliasy:

SELECT h.nazev, r.hvezdicky, r.komentar
FROM recenze AS r
JOIN hry AS h ON r.hra_id = h.id
ORDER BY h.nazev, r.zakaznik_id;
nazevhvezdickykomentar
Bakery Story4Roztomilá a klidná.
Cube Logic3NULL
Cube Logic5Ideální do autobusu.
………

r teď v celém dotazu znamená recenze a h znamená hry, dokonce i v SELECT, který je před FROM: databáze si přečte celý dotaz dřív, než ho provede. Jako alias se obvykle používá první písmeno názvu tabulky nebo pár písmen, aby bylo jasné, která tabulka je která. U tabulek je AS nepovinné: FROM recenze r JOIN hry h ON … znamená totéž a často to tak uvidíte napsané.

h.nazev je kvalifikovaný (plně určený) název sloupce: alias tabulky (nebo její název, když alias nemá), tečka a název sloupce. Ve výsledku se sloupec jmenuje jen nazev. Jakmile má tabulka alias, používejte ho všude: vlastní název tabulky už v tom dotazu nefunguje a recenze.hvezdicky by skončilo chybou no such column: recenze.hvezdicky.

Kvalifikované názvy jsou nutné, když mají obě tabulky sloupec se stejným názvem. Tabulky polozky a hry mají obě sloupec cena, a když napíšete jen cena, databáze neví, který myslíte:

SELECT nazev, cena, pocet
FROM polozky AS p
JOIN hry AS h ON p.hra_id = h.id;
Error on line 1: ambiguous column name: cena

Ambiguous znamená nejednoznačný: mohlo by to znamenat víc věcí. SQLite nehádá, a to je dobře: je velký rozdíl, jestli dostanete cenu, kterou zaplatil zákazník (p.cena), nebo cenu hry v katalogu (h.cena). Stejné je to s id, které mají tabulky objednavky, zakaznici i hry. Sloupec, který je jen v jedné z tabulek, jako nazev, funguje i bez aliasu, ale v dotazu se spojením je dobrým zvykem kvalifikovat všechny sloupce. Kdo dotaz čte (třeba vy za měsíc), hned vidí, odkud který sloupec pochází.

Když chcete stejný sloupec z obou tabulek, přejmenujte je pomocí AS, jak jste se naučili ve 2. lekci, aby výsledek neměl dva sloupce se stejným názvem:

SELECT o.id AS objednavka_id, z.id AS zakaznik_id, z.jmeno
FROM objednavky o
JOIN zakaznici z ON o.zakaznik_id = z.id
ORDER BY o.id;
objednavka_idzakaznik_idjmeno
11Eva Novotná
22Jakub Dvořák
………

Všimněte si ORDER BY o.id: samotné id by bylo nejednoznačné i tam.

Pokyny

Dotaz v editoru má vypsat objednávky s jejich stavem a e-mailem zákazníka, ale končí chybou. Spusťte ho a přečtěte si chybu. Pak ho opravte: id má být ID objednávky, napište tedy místo něj objednavky.id, v SELECT i v ORDER BY. Výsledek pak začíná takto:

iddatumstavemail
12024-01-20zaplacenoeva.novotna@mail.cz
22024-02-14zaplacenojakub.d@mail.cz
32024-02-29zaplacenotereza@svobodovi.cz
…………

Teď dotaz zkraťte pomocí aliasů: o pro objednavky a z pro zakaznici. Použijte je všude v dotazu, i v ON. Výsledek zůstane stejný.

Pod něj napište dotaz, který ukáže každou položku každé objednávky s oběma cenami: objednavka_id, nazev hry, její cenu v katalogu jako cena_hry a cenu, kterou zaplatil zákazník, jako zaplacena_cena. Použijte aliasy p pro polozky a h pro hry a řádky seřaďte podle objednavka_id od nejvyššího, potom podle nazev. Objednávka 28 z výprodeje na Black Friday ukazuje rozdíl:

objednavka_idnazevcena_hryzaplacena_cena
30Bakery Story399399
30Moon Farm499499
29Knight's Oath15991599
28Shadow Ninja649399
28Zombie Town799499
…………

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

3/12