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;| nazev | hvezdicky | komentar |
|---|---|---|
| Bakery Story | 4 | Roztomilá a klidná. |
| Cube Logic | 3 | NULL |
| Cube Logic | 5 | Ideá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: cenaAmbiguous 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_id | zakaznik_id | jmeno |
|---|---|---|
| 1 | 1 | Eva Novotná |
| 2 | 2 | Jakub Dvořák |
| … | … | … |
Všimněte si ORDER BY o.id: samotné id by bylo nejednoznačné i tam.
Jak psát:
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:
| id | datum | stav | |
|---|---|---|---|
| 1 | 2024-01-20 | zaplaceno | eva.novotna@mail.cz |
| 2 | 2024-02-14 | zaplaceno | jakub.d@mail.cz |
| 3 | 2024-02-29 | zaplaceno | tereza@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_id | nazev | cena_hry | zaplacena_cena |
|---|---|---|---|
| 30 | Bakery Story | 399 | 399 |
| 30 | Moon Farm | 499 | 499 |
| 29 | Knight's Oath | 1599 | 1599 |
| 28 | Shadow Ninja | 649 | 399 |
| 28 | Zombie Town | 799 | 499 |
| … | … | … | … |
Začněte programovat zdarma
3/12